EBT 547 - Java Programlama PDF
EBT 547 - Java Programlama PDF
Java Programlama
Hafta 1
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan
bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik,
fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. Java
Java SUN bilgisayar şirketince orijinal olarak elektrikli ev araçlarının (mikrodalga fırınları, buzdolapları,
televizyonlar, uzaktan kumanda cihazları vs.) birbiriyle haberleşmesini sağlamayı amaçlayan bir proje
içerisinde 1991 yılında geliştirilmeye başlandı.
OAK olarak konulan programlama dili daha sonra bu isimde başka bir programlama dili olduğu
keşfedilince, o anda kahve içen programlama grubu tarafından kahve markasından esinlenerek Java olarak
değiştirildi.
1993 Yılında internet büyük bir atılım göstererek bütün dünyaya yayılmaya başladı. Java’nın Dinamik Web
sayfaları hazırlamadaki büyük potansiyelini gören SUN şirketi projeyi bu tarafa yönlendirdi ve bu Java’ya
yeni bir canlılık ve yaşama umudu sağladı.
Mayıs 1995 de SUN Java’yı büyük bir konferansta tanıttı. Java büyük bir ilgiyle karşılandı. Java modern
bilgisayar dünyasının ses, grafik işlem, haberleşme gibi ihtiyaçlarına cevap verebilen ve ticari gayeler için
hazırlanan bir Program dili olarak daha önceki bilgisayar dillerinin hiç birinin kapsayamadığı özellikleri
içermekteydi.
1.1. Java Programlama Dilinin Özellikleri
Her ortamda çalışabilir
Java teknolojisinin en önemli özelliği her ortamda, en küçük bilgisayarlardan süper bilgisayarlara kadar,
çalışabilmesidir. Java teknolojisi bileşenleri nasıl bir bilgisayar, telefon, televizyon, veya işletim sistemi
olduğuna bakmaksızın Java platformunu destekleyen her türlü ortamda çalışır
Basit
Java ile program hazırlamak oldukça kolay ve zevklidir. Daha önce bir programlama dili ile çalışmış veya en
az bir nesneye programlama dili ile çalışmak yeterlidir.
Nesneye dayalı
İleri ki bölümlerde anlatılacağı gibi sınıf ve nesne yapılarıyla daha kolay, defalarca kullanılabilen modüller
yaratılabilir.
Güvenli
Java programlama dili hazırlanan programlar bugün güveliğin çok önemli üst düzey devlet kuruluşlarında
ve NASA da kullanılmaktadır.
Yüksek Performans
Java ile hazırlanan programlar hızlı çalışmaları ve bilgisayara az yük getirmeleri nedeniyle İnternet ve
intranet uygulamalarında tercih edilmektedir.
Server Üzerine Az Yük
Java diğer Web tabanlı programlama dillerine göre sunuculara daha az yük getirmektedir.
2
1.2. Java Teknolojisinin Farklı Versiyonları
Her şeyi her cihazda uygulamaya çalışmaya yönelik “her şeye uyan tek bir şey” problemini ortadan
kaldırmak için, Java 2 Platformu üç versiyona bölünmüştür:
Java 2 Enterprise Edition (J2EE) : karmaşık sunucu çözümlerini yaygınlaştırmak için tasarlanmıştır;
Java 2 Standard Edition (J2SE) : masaüstü bilgisayarlarda kullanılır;
Java 2 Micro Edition (J2ME) : Cep telefonları gibi küçük tüketici elektroniği cihazları için özel olarak
tasarlanmıştır.
Bu yaklaşım, farklı tipte cihazlar için uygun fonksiyonellik bulunmasını garanti eder.
Biz derslerimizde Java 2 Standart Edition kullanacağız.
1.3. Java Geliştirme Seti
Her programda oldugu gibi java programlarinda da ilk evre programi yazmaktir. Java programları editör
programiyla yazilabilirler. Örnegin Unix sistemlerinde vi veya emacs, Windows’da Notepad veya WordPad
programlari kullanilabilir. Programı direkt içinde yazılıp çalıştırılabilen Netbeans, JCreator, Eclipse gibi Java
gelistirme paketleri de mevcuttur. Biz dersimizde SUN firmasının bir ürünü olan Netbeans editörünü tercih
edeceğiz.
Netbeans editörlü Java gelistirme seti (Java Developers kit ‐ JDK) SUN bilgisayar sirketinin
[Link]
internet adresinden ücretsiz indirilebilir. Lisans anlaşmasına göre program dilini bedava olarak
kullanabilirsiniz, ancak satacağınız profesyonel bir program geliştirdiğinizde Sun şirketine kazancınız
üzerinden belirli bir yüzde ödemeniz gerekecektir.
3
1.4. Java Programını Yazma ve Çalıştırma
2. Java Bileşenleri
Java programları komutlar, anahtar sözcükler, tanıtıcılar, hazır bilgiler, işletmenler, ayırıcılar ve boşluğun
bileşeninden oluşmaktadır.
Boşluk : Java bağımsız bir dildir. Düzgün çalışmasını sağlamak amacıyla herhangi bir şeyi içerden yazmak
zorunda değilsiniz. İfadeler arasında istenildiği kadar boşluk bırakılabilir.
Açıklamalar : Açıklamalar bir programın yürütme zamanına katkıda bulunmasalar bile, uygun bir şekilde
kullanıldığında kaynak kodun en değerli kısmını oluşturmaktadır. Geniş programların anlaşılması da
oldukça zordur. Ancak bir sınıfın ya da bir yöntemin ne ve niçin sorularına yanıt verebilen açıklamaları
kullanıcılar için oldukça yararlıdır. Bir kod satırını basit bir şekilde yineleyen komutlar, çok fazla değer
eklemez, ancak algoritmayı gösteren ya da açıklayan komutlar programcılar için işaretçidir.
Açıklamalar tek satırlı veya çok satırlı olabilir.
Tek satırlı komutlar, // ile başlar ve satır sonunda biter. Bu komut türü. tek satırlı bir kodun kısa
açıklamalarında kullanışlıdır.
c = b*d; // c alanı göstermektedir
Daha uzun komutlar için, /* ile başlayıp */ ile biten uzun çok satırlı komutlar hazırlayabilirsiniz. /* ile */
arasında yer alan herhangi bir şey bir komut olarak ele, alınır ve derleyici tarafından göz ardı edilir.
/* * burada 2. derece denklemin
* kökleri bulunmaktadır.
*/
4
2.1. Özel Amaçlı Anahtar Sözcükler
Özel amaçlı anahtar sözcükler özel tanıtıcılardır ve programın tanımlanmasını kontrol etmek için Java dili
tarafından kullanılmaktadır. Yerleşik türleri, değiştiricileri ve akış kontrolü için mekanizmayı tanıtmak için
kullanır. Bunlar toplam 59 tane özel amaç için ayrılmış sözcüktür. İşletmen ve ayırıcıların sözdiziminin
birleştirilmesi ile oluşturulmuş olan bu anahtar sözcükler, Java dilinin tanımlanmasını biçimlendirir. Bu
anahtar sözcükler yalnızca istenen amaca hizmet ederler ve bir değişken, bir sınıf ya da bir yöntem adı için
tanıtıcı olarak kullanılamazlar.
2.2. Tanıtıcılar
Tanıtıcılar sınıf, yöntem ve değişken adları için kullanılır. Bir tanıtıcı büyük ve küçük harf, sayılar, altçizgi ve
dolar işareti ($) karakterinden oluşan bir tanımlayıcı dizidir. Bir sayı ile başlamamalıdır.
Java’nın küçük‐büyük harfe duyarlıdır. OKUL ile Okul birbirinden farklı tanıtıcılardır. Geçerli tanıtıcılar
içerisinde tadSoyad, tx3 söyleyebiliriz. 3x, #cisim ve @2 geçerli olmayan değişken adlarıdır.
Sabitleri gösteren sonuç (final) değişkenler için tümüyle büyük harf kullanılır, PI_SAYISI gibi.
5
2.3. Ayırıcılar
2.4. Değişkenler
Bir Java programında temel bellek birimi değişkenlerdir. Bir tanıtıcı, tür ve kapsam birleşerek bir değişkeni
tanımlayabilir. Değişkenlerinizi bildirdiğiniz yere bağlı olarak, geçici bir kapsam için yerel olabilir ya da
sınıftaki tüm yöntemlere erişebilen örnek değişkenler olabilir. Yerel kapsamlar küme parantezi ile
gösterilir.
Bir değişken aşağıdaki şekilde ifade edilebilir:
tür tanıtıcı [ = değer] [, tanıtıcı [= değer] ...] ;
Tür bir bayt, short, int, long, char, float, double ve boolean değer ya da bir sınıf veya arabirimin adı
olabilir.
2.5. Türler (Değer Tipleri)
Java’da sekiz basit tür yer almaktadır: byte, short, int, long char, float, double ve boolean. Bunlar
dört ana grupta toplanmaktadır:
Tamsayılar: byte, short, int ve long tam değerli sayılardır.
6
Virgüllü sayılar: float ve double virgüllü sayıları gösterir.
Karakterler : Java bir dizilimdeki karakterleri göstermek için Unicode kullandığı için, char türü işaretsiz 16
bitten oluşur ve uluslararası Unhicoed karakter setinin binlerce karakterinden on tanesini depolamak için
kullanılır. Bir char’ın aralığı 0 ile 65536 arasıdır. Negatif karakter yoktur. ASCII olarak bilinen standart
karakter setinin aralığı 0 ile 127 arasıdır.
char bildirimlerine örnekler aşağıda verilmektedir:
char c;
char c2 = 0xf132;
char c3 ='a';
char c4 ='\n';
Karakterleri tamsayı olarak kullanamasanız da tamsayı olarak işletebilirsiniz. İki karakteri birlikte
toplayabilirsiniz ya da bir karakter değişkenin değerini artırabilirsiniz.
Aşağıda verdiğimiz örnekte taban karakterden başladık ve istediğimiz sayıyı gösteren bir tamsayıyı
ekledik:
int iki = 2;
char bir ='1';
char üç = (char) (iki + bir);
Boolean değerler : Java’da mantıksal değerler için adı boolean olan bir tür vardır. Olası olan iki değerden
yalnızca birine sahip olabilir: Doğru (true) ve yanlış (false). Bunlar özel bir amaç için ayrılmış sözcüklerdir.
Boolean, if, while ve do gibi koşullu akış kontrol işletmenleri tarafından gereksinim duyulan bir türdür.
Bir boolean aşağıdaki gibi bildirilir:
boolean done = false;
7
2.6. Diziler
Aynı özelliğe sahip elemanların bir araya getirdiği gruba dizi denir. Diziler tek boyutlu, iki veya üç boyutlu
olabilir. Dizideki herhangi bir elemanı tanımlayabilmek için bir değer vermek yeterli oluyorsa bu dizilere
tek boyutlu diziler denir. Matematikteki sayı dizileri tek boyutlu diziler için iyi bir örnek olabilir. Eğer
dizideki bir elemanı tanımlamak için en az iki değer vermek gerekiyorsa bu dizilere de iki boyutlu diziler
denir. Bunlara en güzel örnek matematikteki matrislerdir.
Diziler belirli kurallara uymak suretiyle tanımlanabilir. Dizilerin ilk elemanı 0. eleman olmaktadır. 11
elemanlı bir sayilar dizisi aşağıdaki şekilde tanımlanır:
int [ ] sayilar=new int [11];
İki veya üç boyutlu diziler ise boyutlar arasına virgül konularak tanımlanır. Örneğin 4 satır 7 sütünlu bir c
matrisi aşağıdaki şekilde tanımlanır :
int [ , ] c = new int [4,7];
2.7. Dizilere Değer Atanması
2.8. 2 Boyutlu Dizilere Değer Atanması
8
3. İfadeler
Her türlü sabit, değişken ve fonksiyonlardan meydana gelen ve program satırında eşitliğin sağ tarafında
yer alan kısma ifade adı verilir. İfadelerin sol tarafında bir değişken ve onu izleyen atama (=) operatörü yer
alır. Sağ taraftaki ifadede elde edilen değer, sol taraftaki değişkene (veya özelliğe) aktarılır.
İfadelere örnekler :
hiz = yol / zaman;
x = y * z + 3;
Java’da satırlar (;) ile sonlandırılır. İfade bir satıra sığmazsa, alt satıra devam edilebilir. (;) işaretine kadar
satır devam edecektir.
3.1. Sayısal İfadeler
Çarpma, bölme, toplama gibi aritmetik işlemlerin olduğu ifadelerdir. Bu işlemler aşağıdaki gibi sıralanabilir
X = X + 3 ifadesini istersek X + = 3 şeklinde yazabiliriz.
Örnekler :
A * = C Î A = A * C
X / = 2 Î X = X / 2
Ayrıca a++; ifadesi a=a+1; ifadesiyle aynıdır. Benzer şekilde a‐‐; ifadesi de a=a‐1; ile aynıdır.
3.2. İlişki İfadeleri
İki değeri karşılaştırmak amacıyla kullanılan ifadelerdir. Karşılaştırılan değerler sayısal veya karakter
şeklinde olabilir. Aşağıdaki tabloda bu ifadeler örnekleriyle gösterilmiştir.
9
3.3. Mantıksal İfadeler
Bu ifadeler iki veya daha fazla ifade arasında kullanılırlar. Mantıksal operatörlerle iki veya daha fazla ilişkiyi
birbirine bağlarlar, sonunda True(Doğru) ya da False(Yanlış) değerini hesaplarlar.
4. Kontrol Deyimleri
4.1. If Deyimi
Komutların yerine getirilmesi, belli ifadelerin doğru ya da yanlış olmasına bağlı olduğu durumlarda
kullanılan bir deyimdir.
if (Koşul)
{
deyim(ler) // koşulun doğru olması durumunda
}
else
{
deyim(ler) // koşulun yanlış olması durumunda
}
if ve else deyimi dışında bir de else if deyimi vardır. Tek koşula bağlı kalmak yerine farklı koşulları
kontrol etmek için, else if deyimi kullanılır.
if (kosul_1)
{
deyim(ler) // kosul_1’in doğru olması durumunda
}
else if (kosul_2)
{
deyim(ler) // kosul_2’nin doğru olması durumunda
}
10
………
………..
………..
else
{
deyim(ler) // koşulların yanlış olması durumunda
}
4.2. Koşullu If Deyimi
Koşul ? İfade 1 : İfade2
Koşul doğru ise İfade1 , değilse İfade2 icra edilecek.
4.3. Switch Deyimi
Switch deyimi, if deyimine benzer işi yapar. Belli değerlere göre programın nasıl davranacağına karar
veren bir akış kontrol mekanizmasıdır.
switch(ifade)
{
case sabit_1:
deyim1;
break;
case sabit_2:
deyim2;
break;
default:
deyim3;
break;
}
İlk önce switch deyimindeki ifadenin değeri case ifadelerindeki sabitlerle karşılaştırılır. Eğer herhangi bir
sabit ile uyuşursa o case bloğu işleme sokulur. Program tüm case ifadelerini inceler, eğer hiç birinde bir
uyum bulamazsa default anahtar sözcüğünün bulunduğu yere gelir ve buradan devam eder.
5. Döngü Deyimleri
Program yazılırken bazen programın belirli kısımlarının defalarca tekrar edilmesi gerekebilir. Bu tekrarlı
işlemleri sağlayan deyimlere Döngü Deyimleri adı verilir.
11
5.1. for Döngüsü
Belirli işlemleri tekrar etmek amacıyla kullanılır. Genel formu aşağıdaki şekildedir :
for (ifade1;ifade2;ifade3)
{
deyim(ler);
}
5.2. while Döngüsü
Bu döngüde, belirli bir koşulun sağlandığı sürece döngü içindeki deyimler icra edilir.
while (koşul)
{
deyim(ler);
}
5.3. do …. while Döngüsü
Döngü içindeki deyimler, döngünün sonundaki <Koşul> geçerli olduğu sürece işlem görecektir.
do
{
deyim(ler);
} while (koşul)
12
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 2
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan
bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik,
fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
Uygulama 1 : if uygulaması
import [Link].*;
2
Uygulama 2 : if‐else uygulaması
import [Link].*;
char notu;
if(puan >= 90)
{
notu = 'A';
[Link]("Harikasınız");
}
else if(puan >= 80)
{
notu = 'B';
[Link]("İyi sayılırsınız");
}
else if(puan >= 70 && puan < 80)
{
notu = 'C';
}
else if(puan >= 60)
{
notu = 'D';
}
else
{
notu = 'F';
[Link]("Seneye tekrar görüşelim");
}
3
Uygulama 3 : Switch‐case
import [Link].*;
4
Uygulama 4 : While örneği (10’dan 1’e doğru yazdırma)
class While {
public static void main(String args[]) {
int n = 10;
while(n > 0) {
[Link](n);
n--;
}
}
}
5
Uygulama 5 : Do‐While örneği (10’dan 1’e doğru yazdırma)
class DoWhile {
public static void main(String args[]) {
int n = 10;
do {
[Link]("tick " + n);
n--;
} while(n > 0);
}
}
6
Uygulama 6 : Powerball Amerika’da oynanan bir şans oyunudur. 1 kırmızı top (1‐42
arasında numarası olan), 5 beyaz top (1‐49 arasında numarası olan) 6 top çekilir.
Beyaz topların numaraları birbirinden farklı olmak zorundadır.
public class Powerball
{
public static void main(String [] args)
{
int beyaz1, beyaz2, beyaz3, beyaz4, beyaz5, kirmizi;
do
{
beyaz3 = (int) ([Link]() * 49 + 1);
}while(beyaz1 == beyaz3 || beyaz2 == beyaz3);
do
{
beyaz4 = (int) ([Link]() * 49 + 1);
}while(beyaz1 == beyaz4 || beyaz2 == beyaz4 || beyaz3 ==
beyaz4);
do
{
beyaz5 = (int) ([Link]() * 49 + 1);
}while(beyaz1 == beyaz5 || beyaz2 == beyaz5 || beyaz3 ==
beyaz5 || beyaz4 == beyaz5);
7
Uygulama 7 : for döngüsü
class Ortalama {
public static void main(String args[]) {
double sayilar[] = {10.1, 11.2, 12.3, 13.4, 14.5};
double toplam = 0;
int i;
8
Uygulama 8 : İç içe for döngüsü
// iki boyutlu dizi - matris
class Matris {
public static void main(String args[]) {
int A[][]= new int[4][5];
int i, j, k = 0;
9
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 3
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan
bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik,
fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. SINIFLAR
Nesneler çevremizde bulunan herşeydir. Araba, uçak, kitap, personel, müdür, fatura, öğrenci gibi.
Programcılar her zaman gerçek yaşamdaki durumlara yakın senaryolar oluşturmaya çalışırlar. Bu yöndeki
ilk adım bilgisayarın yaşadığımız dünyadan nesnelerle ilişki kurmasını sağlamaktır. Hepimizin bildiği gibi,
bilgisayar sadece bir elektronik makinedir. Bilgisayarın bizim bildiğimiz nesneleri tanımasını sağlayacak
bilgiyi vermek, bizim sorumluluğumuzdadır. İşte bu noktada nesneye dayalı modelleme tekniği devreye
girer. Bu modelde gerçek problemlerde karşılaştığımız nesneleri, bilgisayarda benzer nesneler olarak
modelleyebiliriz.
Nesneye dayalı programlamanın esasını sınıf (class) oluşturur. Sınıf aynı cins nesnelerin genel tanımıdır.
Örneğin kullandığımız araba bir nesnedir (Ford gibi). Aynı şekilde başkalarının da kullandığı Opel, BMW,
Mercedes, Renault arabalarının herbiri ayrı birer nesnedir. Bu nesnelerin hepsi araba sınıfı ile
tanımlanabilir. Aynı sınıfa ait nesneler ortak özelliklere sahiptir.
Nesneye dayalı programlama,
1. Nesnelerin ortak özelliklerinin sınıf (class) yapıları kullanılarak tanımlanması,
2. Bu sınıfları kullanarak nesnelerin oluşturulması,
3. Bu nesnelerle uygulamaların gerçekleştirilmesi
aşamalarından oluşur.
Sınıf yeni bir tip veri tanımlar. Bu yeni tip, bu tipte yeni nesneler oluşturmada kullanılır. Bu yüzden sınıf
nesne için bir şablondur. Ve bir nesne sınıfın bir örneğidir.
Sınıfın Genel Biçimi : Bir sınıf, class anahtar sözcüğü ile tanımlanır. Sınıf içinde değişkenler ve metotlar yer
alır.
2
class sinif_ismi {
tip degisken1;
tip degisken2;
……
….
tip metot_ismi1 (parametreler) {
metodun gövdesi
…..
}
tip metot_ismi2 (parametreler) {
metodun gövdesi
…..
}
….
}
1.1. Basit Bir Sınıf Uygulaması :
Yamuk geometrik elemanının alanını hesaplayacak bir program geliştireceğiz.
Alan = (taban+tavan)/2*yukseklik
Tavan
Yükseklik
Taban
3
/* Yamuk sınıfı */
class Yamuk {
double taban;
double tavan;
double yukseklik;
}
// Yamuk sınıfından nesne oluşturacaktır
class YamukTest {
public static void main(String args[]) {
Yamuk ym1 = new Yamuk();
double alan;
// ym1 yamuk nesnesine değerler atama
[Link] = 20;
[Link] = 10;
[Link] = 15;
// yamuğun alanı hesaplanır
alan = ([Link] * [Link]) / 2 * [Link];
[Link]("Yamuğun alanı = " + alan);
}
}
1.2 İki tane nesne deklare eden pogram örneği
/* Yamuk sınıfı */
class Yamuk {
double taban;
double tavan;
double yukseklik;
}
// Yamuk sınıfından nesne oluşturacaktır
class YamukTest {
public static void main(String args[]) {
Yamuk ym1 = new Yamuk();
Yamuk ym2 = new Yamuk();
double alan;
// ym1 yamuk nesnesine değerler atama
[Link] = 20;
[Link] = 10;
[Link] = 15;
// ym2 yamuk nesnesine değerler atama
[Link] = 8
[Link] = 5;
[Link] = 7;
4
// ym1 yamuğunun alanı hesaplanır
alan = ([Link] * [Link]) / 2 * [Link];
[Link]("1. Yamuğun alanı = " + alan);
// ym2 yamuğunun alanı hesaplanır
alan = ([Link] * [Link]) / 2 * [Link];
[Link]("2. Yamuğun alanı = " + alan);
}
}
1.3.Sınıfa Bir Metot Eklemek
/* Yamuk sınıfı */
class Yamuk {
double taban;
double tavan;
double yukseklik;
// yamuğun alanını görüntüle
Void alan(){
[Link](“alan=” + (taban*tavan)/2 * yukseklik);
}
}
// Yamuk sınıfından nesne oluşturacaktır
class YamukTest {
public static void main(String args[]) {
Yamuk ym1 = new Yamuk();
Yamuk ym2 = new Yamuk();
// ym1 yamuk nesnesine değerler atama
[Link] = 20;
[Link] = 10;
[Link] = 15;
// ym2 yamuk nesnesine değerler atama
[Link] = 8
[Link] = 5;
[Link] = 7;
// ym1 yamuğunun alanı yazdırılıyor
[Link]();
// ym2 yamuğunun alanı yazdırılıyor
[Link]();
}
}
5
1.4 Metotdan Değer Döndürmek
/* Yamuk sınıfı */
class Yamuk {
double taban;
double tavan;
double yukseklik;
// yamuğun alanını hesapla ve sonucu gönder
double alan(){
return (taban*tavan)/2 * yukseklik;
}
}
// Yamuk sınıfından nesne oluşturacaktır
class YamukTest {
public static void main(String args[]) {
Yamuk ym1 = new Yamuk();
Yamuk ym2 = new Yamuk();
double alan;
// ym1 yamuk nesnesine değerler atama
[Link] = 20;
[Link] = 10;
[Link] = 15;
// ym2 yamuk nesnesine değerler atama
[Link] = 8
[Link] = 5;
[Link] = 7;
// ym1 yamuğunun alanı yazdırılır
[Link]("1. Yamuğun alanı = " + [Link]());
// ym2 yamuğunun alanı yazdırılır
[Link]("2. Yamuğun alanı = " + [Link]());
}
}
6
1.5. Kurucular (Constructors) :
Bir nesnenin oluşturulduğu anda otomatik olarak çalıştırılan metotlardır. Bir sınıf içinde birden fazla
kurucu olabilir. Nesne oluşturulurken hangi kurucu çağrılacağı parametrelerle belirlenir.
/* Yamuk sınıfı */
class Yamuk {
double taban;
double tavan;
double yukseklik;
// Yamuk constructor
Yamuk() {
taban=6;
tavan=4;
yukseklik=7;
}
// yamuğun alanını hesapla ve sonucu gönder
double alan(){
return (taban*tavan)/2 * yukseklik;
}
}
// Yamuk sınıfından nesne oluşturacaktır
class YamukTest {
public static void main(String args[]) {
Yamuk ym1 = new Yamuk();
double alan;
// ym1 yamuğunun alanı yazdırılır
[Link]("1. Yamuğun alanı = " + [Link]());
}
}
7
1.6. Parametreli Kurucular (Constructors) :
Parametresiz kurucular, her nesne oluşturulduğunda aynı değerleri verdiği için pek kullanışlı değildir.
Değişik değerlerdeki nesneleri oluşturmak için parametreli kurucular programı daha kullanışlı yapar.
/* Yamuk sınıfı */
class Yamuk {
double taban;
double tavan;
double yukseklik;
// Yamuk constructor
Yamuk() {
taban=6;
tavan=4;
yukseklik=7;
}
// parametreli constructor
Yamuk(double tab, double tav, double yuk) {
taban=tab;
tavan=tav;
yukseklik=yuk;
}
// yamuğun alanını hesapla ve sonucu gönder
double alan(){
return (taban*tavan)/2 * yukseklik;
}
}
// Yamuk sınıfından nesne oluşturacaktır
class YamukTest {
public static void main(String args[]) {
Yamuk ym1 = new Yamuk();
Yamuk ym2 = new Yamuk(8,3,6);
double alan;
// ym1 yamuğunun alanı yazdırılır
[Link]("1. Yamuğun alanı = " + [Link]());
// ym2 yamuğunun alanı yazdırılır
[Link]("2. Yamuğun alanı = " + [Link]());
}
}
8
1.7. Metotların Aşırı Yüklenmesi
Aynı metod ismi ile birden fazla metod yazılabilmesidir. Tek kural, aynı tipte parametreleri olan birden
fazla metod olamaz.
// Aşırı yüklenem (overloading)
class AsiriYuklemeTest {
// tamsayı toplama
void topla(int a, int b) {
[Link]("toplam: " + a+b );
}
// reel sayı toplama
void topla(double a, double b) {
[Link]("toplam: " + a+b );
}
// string toplama
void topla(string a, string b) {
[Link]("toplam: " + a+b );
}
}
class AsiriYukleme {
public static void main(String args[]) {
AsiriYuklemeTest t = new AsiriYuklemeTest();
[Link](3,5);
[Link](23.45,56.71);
[Link](“bilgisayar”, “programlama”);
}
}
9
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 4
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan
bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik,
fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
[Link]ıtım
Bir class'ın başka bir class'daki özellik ve metot'lara sahip olmasına kalıtım denir.. Belli bir class, daha
genel bir kavramı ifade eden class'ın üyelerine sahip olarak, onları tekrar tanımlamak zorunda kalmaz. Bir
class'ın diğerindeki özellikleri miras olarak alması için kullanılan anahtar sözcük Java‘da extends ‘dir.
class TüremisSinif extends AnaSinif
{
// ...
}
Örnek :
// ana sınıfı oluşturalım
class A {
int i=0, j=2;
void goster1() {
[Link]("i ve j: " + i + " " + j);
}
}
// B sınıfını A sınıfından türetelim
class B extends A {
int k=5;
void goster2() {
[Link]("k: " + k);
}
void toplam() {
[Link]("i+j+k: " + (i+j+k));
}
}
class KalitimOrnek1 {
public static void main(String args[]) {
A A1 = new A();
B B1 = new B();
// A1 değişkenlerine değer atayalım.
A1.i = 10;
A1.j = 20;
[Link]("A1 değerleri: ");
A1.goster1();
[Link]();
/* B1 değişkenlerine değer atayalım */
B1.i = 17;
B1.j = 22;
B1.k = 19;
[Link]("B1 değerleri: ");
B1.goster1();
B1.goster2();
[Link]();
[Link]("B1 değişkenleri toplamı:");
[Link](); } }
2
2. Erişim Tipleri
Pratikte yaygın olarak kullanılan anlayış, bir programcı bir sınıfı (class) oluşturur ve daha sonra diğer
programcılar bu class’ı kendi kodlarında kullanırlar. Nesneye dayalı programlamanın önemli
özelliklerinden bir tanesi olan encapsulation, sınıf değişkenlerine erişimi kısıtlayarak sınıfı oluşturan kişinin
sınıfını korumasını sağlamaktadır. Bu durumda sınıfı kullanan kişiler, yalnızca public metotlara
erişebilmektedir. Aşağıdaki anahtar sözcükler, metot veya değişkenlere erişimi kısıtlamak veya izin vermek
için kullanılırlar.
Public Bu şekilde tanımlanmış bir metot veya değişkene herhangi bir
yerden ulaşmak mümkündür.
Private Bu şekilde tanımlanmış bir metot veya değişkene sadece sınıf içinden
ulaşmak mümkündür.
Protected Bu şekilde tanımlanmış bir metot veya değişkene tanımlandıkları
sınıftan veya bu sınıftan türetilmiş sınıflardan ulaşılabilir.
Örnek :
// ana sınıf
class A {
int i; // i değişkeni varsayılan olarak public
private int j;
void baslangic(int x, int y) {
i = x;
j = y;
}
}
// B sınıfı
class B extends A {
int top;
void toplam() {
top = i + j; // HATA, j burada erişilemez
}
}
class ErisimOrnek {
public static void main(String args[]) {
B B1 = new B();
[Link](5, 8);
[Link]();
[Link]("Toplam= " + [Link]);
}
}
3. super Kullanımı
3
Bir alt sınıfın, üst sınıfa göndermede bulunması gerektiği durumlarda super anahtar sözcüğü kullanılır. 2
kullanım şekli vardır :
[Link]ım : Üst sınıf kurucusunu çağırır.
Örnek :
// Prizma ana sınıfı.
class Prizma {
private double en;
private double boy;
private double genislik;
// 3 parametreli kurucu
Prizma(double e, double b, double g) {
en = e;
boy = b;
yukseklik = y;
}
// parametresiz kurucu
Prizma() {
en = 0;
boy = 0;
genislik = 0;
}
// küp için kurucu
Prizma(double l) {
en = boy = genislik = l;
}
// hacim
double hacim() {
return e * b * y;
}
}
// Prizma sınıfına ağırlık ekleyerek yeni sınıf oluşturma
class PrizmaAgirlik extends Prizma {
double agirlik;
// 4 parametreli kurucu
PrizmaAgirlik(double e, double b, double g, double a) {
super(e, b, g); // super sınıf kurucusu çağrılır
agirlik = a;
}
// Parametresiz kurucu
PrizmaAgirlik () {
super();
agirlik = 0;
}
// küp için kurucu
PrizmaAgirlik (double l, double a) {
4
super(l);
agirlik = a;
}
}
class PrizmaTest {
public static void main(String args[]) {
PrizmaAgirlik p1 = new PrizmaAgirlik (10, 20, 15, 34.3);
PrizmaAgirlik p2 = new PrizmaAgirlik ();
PrizmaAgirlik kup1 = new PrizmaAgirlik (3, 2);
double h; //hacim
h = [Link]();
[Link]("p1 prizması hacmi= " + h);
[Link]("p1 prizması ağırlığı = " + [Link]);
[Link]();
h = [Link]();
[Link]("p2 prizması hacmi=" + h);
[Link]("p2 prizması ağırlığı = " + [Link]);
[Link]();
h = [Link]();
[Link]("Küpün hacmi= " + h);
[Link]("Küpün ağırlığı = " + [Link]);
[Link]();
}
}
[Link]ım : Bir üst sınıfın, bir alt sınıfın üyesi tarafından gizlenen bir üyesine erişmek için kullanılır.
[Link] şeklinde ifade edilir.
Örnek :
// super kullanarak gizlenen elemana ulaşmak
class A {
int i;
}
class B extends A {
int i; // bu A’daki i ‘yi gizliyor
B(int a, int b) {
super.i = a; // A daki i
i = b; // B deki i
}
void goster() {
[Link]("Üst sınıftaki i: " + super.i);
[Link]("Alt sınıftaki i: " + i);
}
}
class SuperTest2 {
public static void main(String args[]) {
5
B B1 = new B(2, 7);
[Link]();
}
}
4. Bir metodun devre dışı bırakılması veya ezdirilmesi
Alt sınıfa ait bir metot üst sınıftaki metotla aynı ad ve tipe sahipse, üst sınıftaki metot devre dışı kalmış
olur, diğer deyişle ezdirilmiş olur.
Örnek :
// Metodun ezdirilmesi
class A {
int i, j;
A(int a, int b) {
i = a;
j = b;
}
// i ve j yi göster
void goster() {
[Link]("i ve j: " + i + " " + j);
}
}
class B extends A {
int k;
B(int a, int b, int c) {
super(a, b);
k = c;
}
// k yı göster
void goster() {
[Link]("k: " + k);
}
}
class OverrideTest {
public static void main(String args[]) {
B B1 = new B(2, 7, 4);
[Link](); // B deki goster() metodu çağırılır
}
}
5. Ezdirmeyi Önlemek için final kullanımı
6
Bazen metotların ezdirilmesi engellenmek istenebilir. Bu durumda metodun başına final sözcüğü
eklenirse, bu metod alt sınıf tarafından ezdirilemez.
class A {
final void goster() {
[Link]("Bu metot devre dışı bırakılamaz");
}
}
class B extends A {
void goster() { // HATA!
….
}
}
6. Kalıtımı Önlemek için final kullanımı
Bazen bir sınıfın türetilmesini istemeyebilirisiniz. Bunu yapmak için sınıf deklarasyonunun başına final
sözcüğü eklenir.
final class A {
// ...
}
//
class B extends A { // HATA! B A’dan türetilemez
// ...
}
7. Abstract (Soyut) Sınıflar
Abstract (Soyut) sınıflar, tüm alt sınıfları tarafından paylaşılacak metodların tanımlarını içeren sınıflardır.
Soyut sınıflar içeriği belirlenmemiş sadece etiketi belli bir ya da daha fazla soyut metod içerirler. Bu
metodların içeriklerine alt sınıflarda ezdirme (override) yapılarak içerik kazandırılır. Bir soyut sınıftan
türeyen tüm alt sınıflarda bu soyut metodlara ezdirme yapılmalıdır. Bir soyut sınıf tamamlanmamış
olduğu için nesne haline getirilemez. Mutlaka extends anahtar sözcüğü ile yeni sınıflara miras bırakarak
kullanılmalıdır. Kısaca bir sınıf isminden önce “abstract” kelimesi varsa o sınıf soyuttur ve ve en az bir adet
abstract tanımlı metod içermelidir.
Örnek : 2 kenarı olan abstract bir Sekil sınıfı tanımlayalım. Bu şeklin bir alanı olsun ve bunu abstract metot
olarak belirleyelim. Bundan kalıtım yoluyla Dikdortgen ve Ucgen sınıfları oluşturulsun. Bunların alanları
mutlaka ezdirilecek (çünki alan metodu abstract olarak tanımlanmış).
// Abstract metot ve sınıfları kullanmak
abstract class Sekil {
double kenar1;
double kenar2;
Sekil(double a, double b) {
kenar1 = a;
kenar2 = b;
}
7
// alan() abstract metot
abstract double alan();
}
class Dikdortgen extends Sekil {
Dikdortgen(double a, double b) {
super(a, b);
}
// alanın dikdörtgen için ezdirilmesi
double alan() {
return kenar1 * kenar2;
}
}
class Ucgen extends Sekil {
Ucgen(double a, double b) {
super(a, b);
}
// alanın üçgen için ezdirilmesi
double alan() {
return kenar1 * kenar2 / 2;
}
}
class AbstractAlan {
public static void main(String args[]) {
// Sekil s = new Sekil(6, 9); // gecersiz. Abstract sınıftan nesne olmaz
Didortgen d = new Dikdortgen(6, 8);
Ucgen u = new Ucgen(6, 4);
Sekil sekil1; // bu gecerli
sekil1 = d;
[Link]("Dikdörtgenin alanı = " + [Link]());
sekil1 = u;
[Link]("Üçgenin alanı = " + [Link]());
}
}
8. Interface (Arayüz) Sınıfları
8
Soyut sınıflarda ve miras konusunda görüldüğü gibi tek bir sınıftan kalıtım mümkün oluyordu. Fazla sayıda
sınıftan farklı özellikleri aynı anda almak için interface (arayüz) sınıfları mevcuttur. Arayüz sınıflarında
hiçbir metodun içeriği yazılmaz, içerikler altsınıflarda oluşturulur. Altsınıflar arabirim sınıflarını
implements sözcüğü ile çağırırlar. Kısaca arayüz sınıfları interface kelimesi ile tanımlanır (class sözcüğü
geçmez), ve bu arabirimi kullanacak altsınıflarda sınıf adından sonra implements kelimesi ve ardından
arabirim sınıfının adı gelir. Kalıtım ve arayüzler birarada kullanılabilirler.
Örnek :
// A arayüzü
interface A {
void metot1();
void metot2();
}
// B arayüzü A arayüzünden kalıtım alıyor
interface B extends A {
void metot3();
}
// C sınıfı B arayüzünden türetiliyor
class C implements B {
public void metot1() {
[Link]("metot 1 yazdırılıyor");
}
public void metot2() {
[Link]("metot 2 yazdırılıyor ");
}
public void metot3() {
[Link]("metot 3 yazdırılıyor ");
}
}
9
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 5
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak
hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri
mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. AWT
AWT Abstract Windowing Toolkit (Soyut Pencereleme Araçtakımı) anlamına gelir. Grafik kullanıcı
arayüzü oluşturmamızı, klavye ve fare aracılığıyla kullanıcıdan girdi almamızı sağlayan Java sınıfları
kümesidir.
AWT ve Swing
Öncelikle AWT'nin başarılması çok güç bir iş başardığını belirtmek gerekir. Çünkü Java, her işletim
sisteminde çalışmak gibi bir iddiayla ortaya çıkan bir dil ama görsel bileşenler her işletim sisteminde
çok farklı. Farklı görünmeleri önemli değil, bazı bileşenler bir işletim sisteminde bulunurken diğerinde
olmayabiliyor. Bu yüzde AWT, en büyük ortak çarpanı buluyor. Yani bütün işletim sitemlerinde olan
bileşenleri kullanıyor. Düğme hepsinde var ama tablo veya toolbar yok. Dahası her işletim sistemind
olan bileşenler de birbirlerinden farklı özellikler içeriyor. Java bunlardan sadece ortak olanları alıyor.
O yüzden AWT ile yapılan arayüzler çok zengin ve çok güzel değil.
Java'da daha zengin bir arayüz sağlayan Swing kütüphanesi var. O da her işletim sisteminde aynı
şekilde çalışmasına rağmen zengin bileşenler içeriyor. Ancak Swing, bunu işletim sisteminin
bileşenlerini kullanmadan, her şeyi baştan kendisi yaparak başarabiliyor. Yani Swing'in düğme
bileşeni, işletim sistemindeki düğme bileşeni değil. Ona benzetilen, ama baştan yaratılan bir bileşen.
Swing, kendi bileşenlerini kendi yapıyor, sadece her işletim sistemine uygun bir şekilde gürünmelerini
sağlıyor. Hatta istenirse bir işletim sisteminde başka bir işletim sisteminin gürünümü sağlanabiliyor.
Yada hiç bir işletim sisteminde olmayan bir görünüm ortaya çıkabiliyor.
Swing, AWT'den farklı bir arayüz sağlıyor ama yine de kendisi AWT üzerine kurulu. Yani Swing,
AWT'nin temel bileşenlerini kullanıyor. Zaten işletim sisteminin arayüzünün üzerine kurulan AWT.
Swing, AWT'deki temel özellikleri kullanarak kendi bileşenini kendi yapmış oluyor. O yüzden AWT'de
öğrenilen konulanrın %90'ı aynen Swing'de de geçerli. AWT'yi basit arayüzü nedeniyle tercih
etmeyenler de Swing kullanabilmek için AWT'yi bilmek zorunda.
AWT'nin Çalışma Mantığı
AWT'nin çalışma mantığı diğer arayüz sistemlerinden biraz farklı. Nedenlerin bir tanesi AWT'nin başka
işletim sistemlerinin üzerinde çalışmak zorunda olan bir kütüphane olması elbette. Ancak başa bir
neden de, Java'nın Internet dili olarak, her türlü makinede çalışmak gibi bir ilkesi olması. Örneğin çok
büyük ekranlı çok yüksek çözünürlüklü makinelerde de küçük ekran ve düşük çözünürlüklü
makinelerde de çalışmalı. Bir browser içerisinde de çalışmalı bağımsız bir application olarak da
çalışmalı. Bu gibi nedenlerden dolayı farklı bir arayüz sistemlerinde çalışanlar için biraz garip
gelebilecek bir yapıya sahip. Örneğin, 'şu düğmeyi şu X ve şu Y noktasına koy' demiyorsunuz AWT'de.
Onun yerine şunu ortaya şunu sola şunu yukarıya koy diyebiliyorsunuz. Belki bir anlamda sınırlayıcı
olabilen bu özellik, pencerenin büyümesi veya küçülmesi durumunda da bileşenlerin görünmesini
sağladığı için çok avantajlı olabiliyor.
Bir başka özelliği de arayüzün sadece kod yazarak kolaylıkla oluşturulabilmesi. Basit bir pencerenin
içerisine bir tane düğme ve bir tekst alanı koymak için sadece bir kaç satır kod yeterli. Hiç bir görsel
editör kullanmaya gerek yok. Elbette isteyen kullanabilir ama editör kullanmadan da çok iyi arayüzler
üretilebilir.
2. AWT’de Pencereler
Pencereler bileşenlerin yerleştirildiği bölgelerdir. Pencereler bir form gibi düşünülebilir.
2.1. Frame (Çerçeve) : Çerçeveler ayrı pencerelerdir. Frame bir pencere veya bileşen olarak
çalışabilir.
Örnek:
import [Link].*;
public class frame1 extends Frame{
public frame1(String baslik)
{
super(baslik);
}
public static void main (String args[]){
frame1 f = new frame1("deneme cerceve");
[Link](300,200);
[Link](true);
}
}
Programın Çıktısı :
2.2. Panel (Pano) : Panolar çeşitli bileşenleri gruplamak için kullanılır. Panel doğrudan görünmez.
Aşağıdaki örnekte gösterildiği gibi onu bir Frame (Çerceve’ye) ekleyebiliriz.
import [Link].*;
public class Panel1 extends Panel{
public Panel1()
{
}
public static void main (String args[]){
Panel1 p = new Panel1();
Frame f=new Frame(“Panel Ornegi”);
[Link](300,300);
[Link](true);
}
}
Programın Çıktısı :
3. Bileşenler
Bileşenler, Frame ve Panel gibi pencereler üzerine yerleştirilirler.
3.1. Label (Etiket) : Pencereler üzerine etiket yerleştirmek için kullanılır.
Label (String etiket) : Pencere üzerinde belirtilen etiket oluşturulur.
Label (String etiket, hizalama) : Verilen hizalama ile ([Link], [Link] ve [Link]) etiket
yerleştirilir.
3.2. TextField (Metin kutusu) : Metin girmek veya göstermek için kullanılan bileşendir.
TextField () : Metin alanı oluşturur.
TextField (int sütun) : Verilen sayıda sütunu olan bir metin alanı oluşturur.
TextField (String metin) : Verilen metine sahip bir metin alanı oluşturulur.
3.3. TextArea (Metin bölgesi) : Metinin iki veya daha fazla satır olarak alınacağı durumlarda
kullanılır.
TextArea () : Yeni bir metin bölgesi oluşturur.
TextArea (int satir, int sütun) : Verilen sayıda satır veya sütunu olan bir metin bölgesi oluşturur.
TextArea (String metin) : Verilen metine sahip bir metin bölgesi oluşturulur.
3.4. Button (Buton) : Pencereler üzerine buton yerleştirmeyi sağlar.
Button () : Yeni bir boton oluşturur.
Button (String metin) : Verilen metin buton üzerinde gösterilir.
3.5. Checkbox (Seçim kutuları ve Radyo Butonlar) : Seçim kutuları çok seçenekli kullanıcı girişi
için kullanılır. Birden fazla seçim yapılabilir. Radyo buton grubundan ise yalnızca bir tane buton
seçilebilir.
Seçim kutuları oluşturmak için Checkbox’dan yararlanılır. Radyo butonlar oluşturmak için ise ilk önce
CheckboxGroup nesnesi oluşturulur ve radyo butonlar Checkbox ile bu gruba eklenir.
Örnek :
import [Link].*;
public class Kontrol extends Frame{
Label baslik1=new Label("Seçim Kutuları");
Checkbox k1=new Checkbox("C#", true);
Checkbox k2=new Checkbox("Java", false);
Checkbox k3=new Checkbox("Python", false);
Label baslik2=new Label("Radyo butonlar");
CheckboxGroup rb=new CheckboxGroup();
Checkbox rb1=new Checkbox("Evli", rb, true);
Checkbox rb2=new Checkbox("Bekar", rb, false);
Checkbox rb3=new Checkbox("Dul", rb, false);
public Kontrol(String baslik) {
super(baslik);
setLayout (new GridLayout(8,1));
add(baslik1);
add(k1);
add(k2);
add(k3);
add(baslik2);
add(rb1);
add(rb2);
add(rb3);
}
public static void main(String[] args) {
Kontrol kk=new Kontrol ("Seçim kutuları ve Radyo Butonlar");
[Link](300,200);
[Link](true);
}
}
3.6. Choice (Seçim Listeleri) : Kullanıcının bir listeden seçim yapmak için kullanılan bileşendir.
Örnek :
import [Link].*;
public class secim extends Frame{
Label baslik1=new Label("Hangi takımı tutuyorsunuz*");
Choice takim=new Choice();
public secim(String baslik) {
super(baslik);
setLayout(new FlowLayout());
add(baslik1);
[Link]("Fenerbahce");
[Link]("Galatasaray");
[Link]("Besiktas");
[Link]("Trabzon");
[Link]("Sivas");
add(takim);
}
public static void main(String[] args) {
secim t1=new secim("Hangi Takım");
[Link](300,250);
[Link]();
}
}
4. Yerleşim Düzenleri
Pencereler üzerine bileşenlerin nasıl yerleştirileceği Yerleşim Düzenleri ile belirlenir. 5 farklı yerleşim
düzeni vardır.
4.1. FlowLayout Yerleşim Düzeni :. Bileşenler pencere üzerine soldan sağa ve satır satır
yerleştirilir. Bileşenler sola, sağa veya merkezi olarak yerleştirilebilirler. Örneğin bileşenleri
penecereyi ortalayacak şekilde yerleştirmek için :
setLayout (new FlowLayout([Link]));
Örnek :
import [Link].*;
public class Yerlesim extends Frame {
Button b1=new Button("Matris Çarpımı");
Button b2=new Button("Matris Toplamı");
Button b3=new Button("Determinant Hesabı");
public Yerlesim (String baslik){
super(baslik);
setLayout(new FlowLayout([Link]));
add(b1);
add(b2);
add(b3);
}
public static void main(String[] args) {
Yerlesim y=new Yerlesim("FlowLayout Yerleşim düzeni");
[Link](150,150);
[Link]();
}
}
4.2. BorderLayout Yerleşim Düzeni :. Bu yerleşim düzenine gore, pencere 5 bölgeye ayrılır ve
bileşenler bu 5 bölgeye yerleştirilirler. Bu bölgeler :
NORTH (Kuzey) : Pencerenin üst kısmıdır.
EAST (Doğu) : Pencerenin sağ kısmıdır.
SOUTH (Güney) : Pencerenin alt kısmıdır.
WEST (Batı) : Pencerenin sol kısmıdır.
CENTER (Merkez) : Pencerenin merkezidir.
Örnek :
import [Link].*;
public class Yerlesim extends Frame {
Button b1=new Button("NORTH");
Button b2=new Button("EAST");
Button b3=new Button("CENTER");
Button b4=new Button("WEST");
Button b5=new Button("SOUTH");
public Yerlesim (String baslik){
super(baslik);
setLayout(new BorderLayout());
add(b1, [Link]);
add(b2, [Link]);
add(b3, [Link]);
add(b4, [Link]);
add(b5, [Link]);
}
public static void main(String[] args) {
Yerlesim y=new Yerlesim("BorderLayout");
[Link](300,200);
[Link]();
}
}
4.3. CardLayout Yerleşim Düzeni :. Bu yerleşim düzeni üst üste dizilmiş kartları andırı[Link] 3‐4
arayüz bileşeni(Buton,text,label….) bir kartta diğer bileşenler bir kartta olabilir. Kart çoğunlukla Panel
nesnesidir. Buton gibi ayrı bir bileşen, en üstte gösterilecek kartı kontrol eder.
4.4. GridLayout Yerleşim Düzeni :. Bu yerleşim düzeni pencereyi ızgaralara bölmeyi sağlar.
Bileşenler satır ve sütunlara yerleştirilir. Bu yerleşim düzeni, tüm bileşenler aynı boyutta ise kullanılır.
setLayout(new GridLayout(4,3,2,1));
Buradaki paramereler şu anlama geliyor. Birincisi program arayüzünün kaç satıra ikincisi kaç sütuna
bölüneceğini gösteriyor. Bu durumda satır sayısı arttıkça bileşenlerin “eni” o kadar kısa olur. 3 ve 4.
parametreler de bileşenler arasındaki mesafenin ne kadar olacağını “en” ve “boy” olarak belirliyor.
4.5. GridBagLayout Yerleşim Düzeni :. Bu yerleşim düzeni, tüm yerleşim düzenlerinden daha
esnek ve karmaşıktır. Bileşenler tam olarak yerleştirilebilir. Bileşenler aynı boyutta olmak zorunda
değildir. Bileşenler satır ve sütunlara yerleştirildiği için GridLayout yerleşim düzenine benzer. Farklı
olarak yerleşim soldan‐sağa değildir. Bileşenler istenilen satır, sütuna yerleştirilir.
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 6
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak
hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri
mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. Appletler
Applet web tarayıcılarında çalışan küçük uygulamalardır. Bir applet başlarken sunucudan kullanıcının
bilgisayarına yüklenir ve kullanıcı bilgisayarında çalışmaya başlar.
Appletlerin normal java programlarından farkı çalıştığı bilgisayarda kısıtlı haklara sahip olmasıdır.
Çalıştıkları bilgisayardan dosya kopyalayamazlar. Dosya silemezler. Dosya açamazlar veya
oluşturamazlar. İndirildikleri sunucudan başka bir sunucu ile herhangi bir ağ bağlantısı kuramazlar.
İndirildikleri bilgisayarda başka programları çalıştıramazlar. Dosya sistemine erişemezler veya
okuyamazlar.
Appletin bir diğer farkı ise main methodun gerekli olmamasıdır. Appletler [Link].* ve [Link].*
sınıflarını programa dahil etmek zorundadır ve applet çalışırken bazı metodlar otomatik çağırılır. Biz
bu methodları override ederek applete istediğimiz işlemleri yaptırabiliriz.
Bu methodlar :
init() : Applet ilk çalıştığı zaman cağırılır.
start() :Bu method applet başladığında çağırılan ikinci methoddur. Ayrıca applet restart edildiğinde de
çağırılır.
stop() : Applet kapanırken çağırılır.
destroy() :En son çağırılan [Link] tamamen hafızadan silinir.
public class MyApplet extends Applet
{
public void init() {
}
public void start() {
}
public void stop() {
}
public void destroy() {
}
}
Bir applet çalışmasına baştan başlamak zorunda değildir. Önceki çalışmasında kaldığı yerden
başlayabilir.
Bu 4 temel metoda ek olarak paint( ), repaint( ) metotları bulunmaktadır. paint( ) metodu ekran
üzerinde metin veya resim gösterir. paint( ) için graphics sınıfı kullanılır ve bu sınıf [Link] paketinin
bir parçasıdır. repaint( ) metodu bir pencere güncellendiği zaman kullanılır.
Appletler, showStatus( ) metodunu kullanarak durum çubuğunda bilgi gösterir.
Bir applet başladığında AWT aşağıdaki metotları sırasıyla çağırır :
1. init( )
2. start( )
3. paint( )
Bu applet sonlandırıldığında ise aşağıdaki metotlar sırasıyla çağırılır.
1. stop( )
2. destroy( )
Örnek : Basit bir applet oluşturalım. Zemin rengi kırmızı, yazı rengi beyaz olsun. Applet sırasıyla hangi
metotları çağırdığını mesaj değişkeninde saklayalım ve drawString ile yazdıralım.
Applet 1
import [Link].*;
import [Link].*;
/*
<applet code="Sample" width=300 height=50>
</applet>
*/
public class Applet1 extends Applet{
String mesaj;
public void init() {
setBackground([Link]);
setForeground([Link]);
mesaj = "init() metodu ***";
}
public void start() {
mesaj += "start metodu() ***";
}
public void paint(Graphics g) {
mesaj += "paint() metodu";
[Link](mesaj, 10, 30);
}
}
Applet 2
//Durum penceresinin kullanımı
import [Link].*;
import [Link].*;
public class Applet1 extends Applet{
String mesaj;
public void init() {
setBackground([Link]);
setForeground([Link]);
}
public void paint(Graphics g) {
[Link]("Bu bir applet penceresidir", 10, 30);
showStatus("Bu mesaj durum satırında gösteriliyor.");
}
}
2. Olay Yönetimi
Grafik kullanıcı arayüzleri, tüm kullanıcı etkileşimlerini olaya dayalı bir model yardımı ile yönetir. Bir
tuşa basma, fareyi hareket ettirme, bir butona tıklama gibi işlemler bir olay oluşturur. Olaylar direkt
olarak kullanıcı arayüzü ile etkileşimden doğmayabilir. Bazen bir olay, zamanlayıcının süresi
dolduğunda, sayaç belli bir değeri aştığında da oluşabilir.
2.1. Olay Sınıfları : Olayları temsil eden sınıflar, Java’nın olay yönetim mekanizmasının temelinde
yer alır. [Link] paketi, kullanıcı arayüzleri tarafından üretilen, olay tipleri tanımlar.
Olay Sınıfı Açıklama
ActionEvent Bir düğmeye basıldığında, bir liste öğesi çift tıklandığında veya bir menü
öğesi seçildiğinde üretilir
AdjustmentEvent Kaydırma çubuğu hareket ettirildiğinde üretilir.
ComponentEvent Bir bileşen gizlendiğinde, taşındığında, boyutu değiştirildiğinde veya
görünür hale getirildiğinde üretilir.
ContainerEvent Bir bileşen pencereye eklendiğinde veya çıkarıldığında üretilir.
FocusEvent Bir bieşen klavye odağı kazandığında veya onu kaybettiğinde üretilir.
InputEvent Tüm bileşen girişleri için abstract sınıf
ItemEvent Bir onay kutusu veya liste öğesi tıklandığında üretilir.
KeyEvent Klavyeden bir giriş yapıldığında üretilir.
MouseEvent Fare sürüklendiğinde, taşındığında, tıklandığında veya bırakıldığında
üretilir.
MouseWheelEvent Fara tekerleği hareket ettirildiğinde üretilir.
TextEvent Bir metin alanının ya da metin kutusunun değeri değiştiğinde üretilir.
WindowEvent Pencere etkinleştirildiğinde, kapandığında, simge durumuna
getirildiğinde…. Üretilir.
2.2. Olay Dinleyicisi Arabirimleri : Dinleyici (Listener) bir olay meydana geldiğinde bilgilendirilen
bir nesnedir. Dinleyici arabirimleri, her olayı yönetmek için çeşitli metotlar sunar. Bu arayüzleri
gerçekleştiren sınıflarda bu metotların üzerine yazılmalıdır.
Arayüz
ActionListener
AdjustmentListener
ComponentListener
ContainerListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
MouseWheelListener
TextListener
WindowFocusListener
WindowListener
Örnek : Fare Olaylarını Yönetmek : Farenin applet üzerine tıklanması ve farenin appletin dışına
çıkması olaylarını yönetmek için basit bir uygulama yapalım.
MouseListener (Fare dinleyici arabirimi applete uygulanır. init() metodunda addMouseListener
applete eklenir. Bu dinleyici arayüzün 5 metodu vardır. Biz yalnızca 2 metodu kullanıyoruz. Diğer 3
metodu aynen bırakıyoruz.
import [Link].*;
import [Link].*;
import [Link].*;
public class Applet1 extends Applet implements MouseListener {
String mesaj = "";
int fareX = 0, fareY = 0; // fare koordinatları
public void init() {
addMouseListener(this);
}
// fare tıklaması
public void mouseClicked(MouseEvent me) {
fareX = 0;
fareY = 10;
mesaj = "Fare tıklandı";
repaint();
}
// farenin çıkması
public void mouseExited(MouseEvent me) {
fareX = 0;
fareY = 10;
mesaj = "Fare appletin dışına çıktı";
repaint();
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void paint(Graphics g) {
[Link](mesaj, fareX, fareY);
}
}
Örnek : Klavye Olaylarını Yönetmek : Fare olayına benzer. Fark olarak KeyListener dinleyicisi kullanılır.
Bir tuşa basıldığında keyPressed(), tuş bırakıldığında keyReleased(), bilgi girişi için keyTyped()
metotları çalıştırılır.
import [Link].*;
import [Link].*;
import [Link].*;
public class Applet1 extends Applet
implements KeyListener {
String mesaj = "";
int X = 10, Y = 20; // çıkış koordinatları
public void init() {
addKeyListener(this);
}
public void keyPressed(KeyEvent ke) {
showStatus("Tuşa basıldı");
}
public void keyReleased(KeyEvent ke) {
showStatus("Tuş bırakıldı");
}
//karakter girişi
public void keyTyped(KeyEvent ke) {
mesaj += [Link]();
repaint();
}
// Display keystrokes.
public void paint(Graphics g) {
[Link](mesaj, X, Y);
}
}
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 7
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak
hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri
mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. GRAFİKLER
1.1. Giriş
AWT paketinin sağladığı Graphics sınıfı, zengin bir metod koleksiyonu sunar. Bu metotlar, oval,
dikdörtgen, kare, daire, çizgi ve farklı fontlarda metin çizmek için kullanılır.
Bu şekiller farklı renklerde çizilebilir. Grafikler pencerelerde veya appletlerde oluşturulabilir.
Bir şekil çizmek için grafiksel bir zemin gereklidir. Grafiksel bir zemin elde etmek için, getGraphics()
metodu veya aşağıdaki 3 metotdan biri çağrılmalıdır :
repaint( ) : Yeniden çizim ihtiyaci olduğu zaman çağırılır.
update (Graphics g) : repaint( ) metodu tarafından otomatik olarak çağırılır.
paint(Graphics g) : update ( ) metodu tarafından çağırılır.
1.2. drawString (Metin çizme )
drawString (String metin, int X, int Y);
X: Metnin çizdirilmeye başlayacağı noktanın X koordinatı (Not : X koordinatı sol üst köşede 0’dır ve
sağa doğru pozitiftir.).
Örnek :
import [Link].*;
import [Link].*;
drawLine (X1, Y1, X2, Y2);
X1,Y1: Çizimin başlayacağı koordinatlar
X2,Y2: Çizimin biteceği koordinatlar
Örnek :
import [Link].*;
import [Link].*;
1.4. drawRect ve fillRect (İçi boş ve dolu Dikdörtgen çizmek)
drawRect (ust, sol, genislik, yukseklik);
fillRect (ust, sol, genislik, yukseklik);
Örnek :
import [Link].*;
import [Link].*;
drawOval (ust, sol, genislik, yukseklik);
fillOval (ust, sol, genislik, yukseklik);
Elips, belirtilen dikdörtgen içine çizilir.Çember çizmek için ise belirtilen dikdörtgeni kare olarak
tanımlamak gerekiyor.
Örnek :
import [Link].*;
import [Link].*;
1.6. drawArc ve fillArc (İçi boş ve dolu Yay çizmek)
drawArc (ust, sol, genislik, yukseklik, ilkAci, YayACisi);
fillArc (ust, sol, genislik, yukseklik, ilkAci, YayACisi);
Yay ilkAci’dan başlayarak YayAcisi miktarı kadar açı yapacak şekilde çizilir.
Örnek :
import [Link].*;
import [Link].*;
drawPolygon (x[ ], y[ ], noktaSayisi);
fillPolygon (x[ ], y[ ], noktaSayisi;
Örnek :
import [Link].*;
import [Link].*;
[Link](x, y, n);
}
1.8. Renklerle ve Fontlarla Çalışmak
Grafiklerde rengi ayarlamak için setColor(renk) metodundan yararlanılır.
Örnek :
setColor ([Link]) :Renk maviye ayarlanır.
Font oluşturmak için ilk önce Font sınıfından font nesnesi örneklenir.
Font f=new Font(“Arial”, [Link], 14)
Daha sonra setFont(f) ile kullanılacak font saptanmış olur.
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 8
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak
hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri
mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. SWING
1.1. Giriş
Java ilk çıktığı zaman tek grafik kullanıcı arayüzü AWT idi. Fakat daha önceden de bahsettiğimiz
AWT'nin yetersizliklerini gidermek için 1997 yılında Swing kullanılmaya başlanmıştır. Swing ilk defa
Java 1.1 için ayrı bir kütüphane halinde sunulmuştur, daha sonra Java 1.2 ile birlikte Java'nın bir
parçası haline gelmiştir.
Swing, AWT’ye özgü birçok sorunu gidermesine rağmen AWT’nin yerine geçmez. Aksine Swing,
AWT’nin temelleri üzerine kurulmuştur. Bunun dışında Swing, AWT’nin olay yönetimini kullanır.
Bir Swing kullanıcı arayüzü pencereler ve bileşenler olmak üzere 2 temel öğeden oluşur.
Pencereler, JFrame, JApplet, JWindow ve JDialog ‘tur. Uygulamalarda çoğunlukla kullanılan
JFrame’dir. Applet’ler için ise JApplet’dir.
Bütün Swing bileşenleri [Link] paketi içindeki sınıflarca tanımlanmıştır. JButton, JLabel,
JComboBox bileşen sınıflarından bazılarıdır.
1.2. Basit bir Swing Uygulaması
import [Link].*;//Swing kütüphanesi
public class swing1 {
public swing1(){
JFrame jf1 = new JFrame("Swing Dünyası");
[Link](250,200); //pencere boyutları
[Link](JFrame.EXIT_ON_CLOSE);
[Link](true);
}
public static void main(String[] args) {
swing1 sw1 = new swing1();
}
}
1.3. JOptionPane
Ekrandan bilgi girişi ve ekrana bilgi yazdrlmas amacyla kullanlan bir komuttur.
JOptionPane snfnn showInputDialog isimli metodu yardmyla meydana gelen bir pencere
araclğyla bilgiler kullancdan istenmekte ve JOptionPane snfnn showMessageDialog isimli
metoduyla bilgiler ekranda gösterilmektedir.
1.3.1. Örnek : Diyalog kutusu aracılıgıyla girilen 2 tamsayının toplamını bulup, sonucu diyalog
kutusunda gösteren uygulama
import [Link];
public class Toplama
{
public static void main( String args[] )
{
String sayi1 =
[Link]( "1. Tamsayıyı giriniz" );
String sayi2 =
[Link]( "2. Tamsayıyı giriniz" );
[Link]( null, "Toplam " + toplam,
"2 tamsayının toplamı", JOptionPane.PLAIN_MESSAGE );
}
}
1.4. Swing Bileşenleri
JLabel : Bir etiket oluşturan bileşendir. Metin veya simge görüntülemek için kullanılır.
JTextField : Bir satırlık metin girişi yapabilmeyi ve düzenlemeyi sağlayan bileşendir.
JButton : Buton bileşeninin oluşturulmasını sağlar.
JToggleButton : Görüntüsü JButton gibidir. Fakat farklı davranır. Basılmış ve bırakılmış 2 hali vardır.
JCheckBox : Seçim kutuları oluşturmak için kullanılan bileşendir.
JRadioButton : Herhangi bir anda yalnızca bir düğmenin seçilebileceği bileşenleri oluşturur.
JTabbedPane : Sekmeli paneller oluşturur.
JScrollPane : Bir diğer bileşenin kaydırılmasını yöneten bileşendir.
JList : Bir listeden bir yada daha çok öğenin seçilmesini sağlayan bileşendir.
JComboBox : Açılır seçme listesi oluşturur.
JTree : Bilginin görünümünü hiyerarşik olarak gösteren bir bileşendir.
JTable : Verileri satırlar ve sütunlar halinde görüntüleyen bir bileşendir.
1.4. 1. Örnek : Fahrenheit’ı Celsius’a çeviren program
[Link]
import [Link];
public class Convert
{
public static void main( String args[] )
{
ConvertFrame convertFrame = new ConvertFrame();
[Link]( JFrame.EXIT_ON_CLOSE );
[Link]( 225, 90 );
[Link]( true );
}
}
[Link]
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class ConvertFrame extends JFrame
{
private JLabel label1;
private JLabel label2;
private JTextField temperatureF; //
public ConvertFrame()
{
super( "Sıcaklık Dönüştürücü" );
label1 = new JLabel( "Fahrenheit sıcaklığını giriniz:" );
temperatureF = new JTextField( 10 );
[Link](
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int temp = [Link]( [Link]() );
int celcius = ( int ) ( 5.0f / 9.0f * ( temp ‐ 32 ) );
[Link]( "Sıcaklık (Celsius olarak): " + celcius );
}
}
);
label2 = new JLabel( "Sıcaklık (Celsius):" );
setLayout( new BorderLayout() );
add( label1, [Link] );
add( temperatureF, [Link] );
add( label2, [Link] );
}
}
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 9
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak
hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri
mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. İSTİSNA YÖNETİMİ
İstisnalar, programımızın çalışma zamanında yani program çalışırken ortaya çıkan olağan dışı
durumlardır. Programcılık dilinde "programın kırılması" ile adlandırılan olaylarda aslında bir istisnanın
meydana geldiğini göstermektedir. Örneğin bir sayının sıfıra bölünmesi "Sıfıra Bölme" istisnasının
ortaya çıkmasına sebep olmaktadır. Başka bir istisna örneği ise uyumsuz tipler arasında değer
aktarımı gerçekleştirmeye çalışmaktır. Java istisna yönetim sistemi kullanılarak, çalışma zamanı
hatalrı kontrollü bir şekilde yönetilebilir. Java’da istisna yönetimi try, catch, throw ve finally anahtar
sözcükleriyle gerçekleştirilir.
İstisnalar iki şekilde ortaya çıkar :
1. Yazılımcı "throw" ifadesini kullanarak kendi istisnası ortaya çıkartabilir.
2. Programımızın normal olarak devamını sürdürmesini engelleyecek hatalardır.
İstisnaları ortaya çıkartmak ve bu istisnaları yakalayıp yönetmek ayrı işlerdir. Bir istisnayı yakalamak
için öncelikle istisnanın ortaya çıkabileceği kod aralığını tespit etmek gerekir. Bu işlem
gerçekleştirildikten sonra aşağıdaki ifadelerden birini kullanarak istisna yakalama işlemi
gerçekleştirilir.
[Link] …. catch
Try ….Catch ifadelerinde, istisnanın ortaya çıkması muhtemel olan kod alanı try{......} catch
parantezleri arasına alınmıştır. Bu kod artık izlenmektedir. Parantez içerisinde bir hata meydana
geldiğinde; hatanın ortaya çıktığı noktadan sonraki kodlar işleme konulmaz ve parantezden sonraki
kod işleme alınır. Kod satırı işleme konulmadan catch ifadesine atlanır. catch ifadesi adındanda
anlaşılacağı gibi istisnaların yakalanıp seviyelendirildiği alandır. Bütün hatalar Exception nesnesi
tarafından yakalanabilmektedir. IOException sınıfı bünyesinde çeşitli özellik ve metotlar
barındırmaktadır.
class HataTakibi
{
static void Main()
{
int a = 5;
int b = 0;
int bolum;
try
{
bolum = a / b;
a = a + 3;
[Link] ([Link]());
}
catch (IOException e)
{
[Link] (“Sıfıra Bölme Hatası”);
}
}
}
1.2. try ……finally
İstisna takibinde try finally bloğunun özelliği; hata ortaya çıksa da çıkmasa da bu finally bloğunun
çalışıyor olmasıdır. Try{} bloğu içerisinde bir istisna ortaya çıktığında kodumuz aynen try catch
ifadesinde olduğu gibi hatanın ortaya çıkmış olduğu noktadan sonraki kodlar çalışmadan finally
bloğuna geçilir. Catch ifadesinden farklı olarak hatanın çeşidinin tespiti mümkün değildir. Finally
bloğu programlarımızda kullanım sebebi try {} içerisinde yaratmış olduğumuz nesnelerin
sonlandırılması veya değişkenlerin son değerlerinin belirlenmesi gereken durumlarda kullanılır.
1.4. Throw ifadesini kullanma
Throw ifadesi istisnaları istediğimiz anda ortaya çıkartmamıza imkan vermektedir. Throw ifadesi
IOException sınıf veya bu sınıftan türetilmiş herhangi bir istisna sınıfı için kullanılır. Throw ifadesinin
kullanıldığı noktada program durarak; istenilen istisnayı üretir.
2. JENERİKLER
Jenerikler parametrelendirilmiş tip anlamına geliyor. Oluşturduğumuz nesneleri tiplerden bağımsız
hale getirmemizi sağlıyor. Böylece kodlarımızı yeniden kullanma yeteneğimiz arttırıyor. Bu işlemi
yaparken tip güvenliğini de elden bırakmıyor. Jenerikleri kullanarak farklı veri tipleriyle otomatik
olarak çalışan bir tek sınıf oluşturmak mümkündür.
Jenerikleri daha iyi anlatabilmek için, Jenerik kullanmadan ve kullanarak iki örnek yapalım :
2.1. Jenerik kullanmadan farklı tipteki dizileri yazdırma
// Aşırı yükleme metotları kullanarak farklı tipteki dizileri yazdırma
public class NoJenerik
{
// Tamsayı dizi yazdırma için metot
public static void printArray( Integer[] inputArray )
{
for ( Integer element : inputArray )
[Link]( "%s ", element );
[Link]();
}
// Double dizi yazdırma için metot
public static void printArray( Double[] inputArray )
{
for ( Double element : inputArray )
[Link]( "%s ", element );
[Link]();
}
// Karakter dizi yazdırma için metot
public static void printArray( Character[] inputArray )
{
for ( Character element : inputArray )
[Link]( "%s ", element );
[Link]();
}
public static void main( String args[] )
{
// Tamsayı, Double ve Karakter dizilerini oluşturma
Integer[] integerArray = { 1, 2, 3, 4, 5, 6 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
Character[] characterArray = { 'H', 'E', 'L', 'L', 'O' };
[Link]( "Tamsayı dizi elemanları:" );
printArray( integerArray );
[Link]( "\nDouble dizi elemanları:" );
printArray( doubleArray );
[Link]( "\nKarakter dizi elemanları:" );
printArray( characterArray );
}
}
2.2. Jenerik kullanarak farklı tipteki dizileri yazdırma
// Jenerik metotları kullanarak farklı tipteki dizileri yazdırma
public class Jenerik
{
// Jenerik metot
public static < E > void printArray( E[] inputArray )
{
for ( E element : inputArray )
[Link]( "%s ", element );
[Link]();
}
public static void main( String args[] )
{
// Tamsayı, Double ve Karakter dizilerini oluşturma
Integer[] integerArray = { 1, 2, 3, 4, 5, 6 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
Character[] characterArray = { 'H', 'E', 'L', 'L', 'O' };
[Link]( "Tamsayı dizi elemanları:" );
printArray( integerArray );
[Link]( "\nDouble dizi elemanları:" );
printArray( doubleArray );
[Link]( "\nKarakter dizi elemanları:" );
printArray( characterArray );
}
}
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 10
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak
hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri
mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. ÇOK KANALLILIK
1.1. Çok Kanallılık, Thread ve Runnable
Çok Kanallı Programlama (Multi‐Threaded Programming), bir programda aynı anda birden fazla işin
yapılabilmesidir. Yani bir kod parçası bir işlemi gerçekleştirirken aynı anda ona paralelel olarak bir
başka kod parçasının çalışması demektir. Bir birine paralel çalışan çalışanlardan her birine kanal
(thread) denir.
Java çok kanallı porgramlamayı temelden desteklemektedir. Yani çok kanallılık dile bir takım
kütüphanelerle eklenmemiştir. Aslında her Java programı bir kanalda (thread'te) çalışır.
Daha sonra programın bu kanalı gören herhangi bir noktasından 'Thread' sınıfının 'start' metodu
çalıştırılarak. Thread çalışmaya başlatılabilir. Bu metod kendi içinde, 'run' metodunu çağıracak ve
dolayısıyla kanala yaptırmak istediğimiz işler yapılmaya başlıyacaktır.
Kanalın 'run' metodu içinde genellikle gecikmeler içeren döngüler kullanılır:
public class kanal1 extends Thread {
...
... <kendi kanal sınıfımızın diğer metod ve özellikleri>
...
public void run() {
while(true) {
...
... <belirli aralıklarla yaptırılacak işler>
sleep(1000); // Örneğin her seferinde 1 saniye beklenecek
... <belirli aralıklarla yaptırılacak işler>
...
}
}
}
Burada 'Thread' sınıfının 'sleep' metodu ile kanal belli bir süre sonra çağrılmak üzere bekleme
kuyruğuna alınır. Bu sayede diğer kanallar da çalışma fırsatı bulurlar. Aynı şekilde 'sleep' yerine aynı
sınıfın 'yield' metodu kullanılarak işletimi diğer kanallara geçirmek de mümkündür.
Bazen kanalları yaratırken 'Thread' sınıfını devralmak (inheritance) uygun olmayabilir. Bu durumda
'Runnable' arabirimi (interface) kullanılarak da çalıştırılabilir (runnable) bir sınıf yaratılabilir:
public class myThread implements Runnable {
...
...
...
public void run() {
...
...
...
try {
[Link](1000);
}
catch(InterruptedException e) { }
...
...
}
}
1.2. Dijital Saat Örneği
import [Link];
import [Link];
import [Link];
import [Link];
public class analog extends Applet implements Runnable{
Font theFont=new Font("TimesRoman",[Link],24);
Date theDate;
Thread runner;
public void start()
{
if(runner==null)
{
runner=new Thread(this);
[Link]();
}
}
public void stop()
{
if(runner!=null)
{
[Link]();
runner=null;
}
}
public void run()
{
while(true)
{
theDate=new Date();
repaint();
try {[Link](1000);}
catch(InterruptedException e) {}
}
}
public void paint(Graphics g)
{
[Link](theFont);
try
{
[Link]([Link](),10,50);
}
catch(NullPointerException e){}
}
}
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 11
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak
hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri
mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
AĞ PROGRAMLAMA
Java’nın en önemli özelliklerinden birisi İnternet uyumluluğudur. Java programları, ağ üzerinde
iletişim kurmak için [Link] paketi kullanır. Bu paket, ağ programlamayı destekleyen bir grup sınıftan
oluşur.
İnternet üzerinde, pek çok bilgisayar birbiri ile iletişim kurmak için protokol kullanır.
1.1. Protokoller
Protokoller bir bilgisayardan diğerine bilgi aktarmak için kullanılır. Bilgisayarlar, İnternet Protokolu
(IP) ismi verilen veri paketleri değiş‐tokuşu ile iletişim kurarlar. IP, internet üzerinde bir bilgisayardan
diğerine veri aktarmak için kullanılan ağ protokolüdür.
IP, kaynak ve hedef bilgisayarları belirlemek zorundadır. Bunu yapmak için IP adreslerini kullanır. Her
internet adresi, ağdaki her bilgisayarı benzersiz şekilde tanımlayan bir numaradır. Orijinal olarak tüm
internet adresleri, dört tane 8 bit’lik değer halinde organize edilmiş 32 bit’lik bir değerden meydana
gelir. Bu adres tipi IPv4 (Internet Protocol, sürüm 4) tarafından tanımlanmıştır. Ancak IPv6 (Internet
Protocol, sürüm 6) olarak adlandırılan yeni bir adresleme şeması geliştirilmiştir. IPv6, bir adresi
göstermek için 8 tane 16 bit’lik değer halinde organize edilmiş 128 bit’lik değer kullanır. IPv6 , IPv4’ün
desteklediğinden daha geniş bir adres uzayını desteklemektedir.
IP, kaynak bilgisayardan veriyi hedef bilgisayara yönlendirir. Bir bilgisayardaki belli programlara veri
göndermek için Bağlantı Noktaları (port) kullanılır.
Portlar programlar arasındaki iletişim sağlar. Port adresleri çoğunlukla belli bir uygulama protokolü ile
ilişkilendirilmiş 16‐bit sayılardır. Port numarası, bir adresleme şemasının en önemli parçasıdır. Port
numarası yanlış ise mesajlar uygulamalar arasında kaybolacaktır. Bazı önceden atanmış port
numaraları internet üzerinde kullanılır :
İstemci ve sunucu programları arasında iletişim için FTP, SMTP, http gibi birçok uygulama protokolü
vardır. Taşıma protokolleri ise uygulama protokolleri arasındaki iletişime yardımcı olur. Bir porttan
diğer bir porta mesaj aktarmak için kullanılır. Mesaj, bir bağlantı veya bağlantısız iletişim metodu ile
aktarılır.
TCP : Kaynak ve hedef portların IP adresleri arasında bir bağlantı oluşturur. Bu portlar bağlantı
kapatılana veya kopana kadar bağlıdır. TCP bağlantıyı kaynaktan hedefe bir bayt akımı olarak
gerçekleştirir. [Link] sınıfları TCP destekler.
UDP : Bağlantısız bir protokoldür. Bağlanmak için bir bağlantı oluşturmaz. Basit bir örnek normal
postadır. Bir şey postalarken, bir mesaj ve hedefin adresini yazarız ve mektubu posta kutusuna
koyarız. UDP’de hedef portu ve IP adresini datagram ismi verilen öbek içine yazar. Sonra datagramı
hedefe gönderir. UDP, TCP’ye göre güvensizdir. Çünki teslimat garantisi yoktur.
İstemciler ve sunucular soketler aracılığıyla bağlantı oluştururlar. Bu bağlantılar TCP kullanılarak
oluşturulan iletişim bağlantılarıdır. İstemciler istemci soketleri aracılığıyla iletişim kurarken, sunucular
sunucu soketleri aracılığıyla iletişim kurarlar.İstemci, sunucu ile iletişim kurmak için sunucu soketine
bir bağlantı oluşturur. İstemci ve sunucu sonra bağlantı üzerinden veri alış‐verişi sağlar.
Bir soket oluşturmak için [Link] sınıfından nesne oluşturlmalıdır. Sonra internet üzerinden
veri gönderilebilir ve okunabilir. Bir telefon görüşmesi için telefon numarasını bilmek zorunda
olunduğu gibi, alıcının IP adresi bilinmelidir.
Soketler, makine adresi ve port numarası ile ilişkilendirilir. Makine adresi, istemci veya sunucu
programlarının bulunduğu makinenin IP adresidir. Port adresi, istemci/sunucu programlarının
kullandığı iletişim portudur.
Bağlantısız iletişim yerine bağlantılı iletişim her zaman tavsiye edilir.
2. [Link]
[Link] paketi, soket tabanlı istemci/sunucu iletişimini destekleyen sınıflar sunar.
[Link] paketi aşağıdaki sınıflardan oluşur :
InetAddress
Socket
ServerSocket
DatagramSocket
DatagramPacket
2.1. InetAddress Sınıfı
Bu sınıf, internet üzerinde adresleri bulmaya yardım eder. Adresi bulmak için sadece isim yeterlidir.
Inetrnet IP adreslerini özetler. Hem sayısal IP adreslerini hem de makine isimlerini destekler.
getLocalHost() : Yerel makinenin adresini tutar.
getHostName() : Makinenin alan adını döndürür.
getHostAddress() : Makinenin sayısal IP adresini gösterir.
getByName() : Bir makinenin internet adresini göstermek için kullanılır.
Örnek :
import [Link].*;
public class ag1 {
public static void main(String args[]) throws UnknownHostException {
InetAddress Adres1 = [Link]();
[Link](Adres1);
Adres1 = [Link]("[Link]");
[Link](Adres1);
}
}
2.2. Socket Sınıfı
Java programları ağa bağlanmak için bir soket kullanır. “Socket” sınıfı, istemci bağlantılarının
oluşturulmasına ve istemci ve sunucu arasında uygulamalar geliştirilmesine yardımcı olur.
getInetAddress() : IP adresini elde etmek için kullanılır.
getPort () : Makinenin port numarası
getLocalPort () : Yerel port numarası
getLocalAddress () : Yerel IP adresi
getInputStream() ve getOutputStream (): Girdi ve çıktı akımlarına erişmek için
close () : Soketi kapatır.
SO_LINGER : close() metodunu çağırdıktan sonra soketin ne kadar açık kalacağını belirten
zamanı tanımlar.
SO_TIMOUT : Zaman aşımına uğramadan önce soket üzerindeki bir okuma işleminin ne kadar
bekledikten sonra bloke olacağını tanımlar.
TCP_NODELAY : Soket bağlantısı üzerinden gönderilen veriyi tanımlamak için bir algoritmanın
kullanılıp kullanılmayacağını belirler.
setSocketImplFactory () : Varsayılan Java soket gerçekleştirmesinden geleneksel soket
gerçekleştirmesine geçer.
2.3. ServerSocket Sınıfı
Bu sınıf TCP sunucusu soketini gerçekleştirir.
accept () : Sunucu soketinin dinleme moduna geçmesini ve bir gelen bağlantı oluşturuluna kadar
beklemesini sağlamak için kullanılır.
getInetAddress() : IP adresini elde etmek için kullanılır.
getLocalPort () : Sunucu soketinin gelen bağlantılar için dinlediği yerel port numarası
toString () : Soketin adresini ve port numarasını dizgi olarak döndürür.
implAccept () : Accept metodunun üzerine yazar.
2.4. DatagramSocket Sınıfı
Bu sınıf UDP protokolü kullanarak istemci ve sunucu soketlerini gerçekleştirir.
UDP, istemci ve sunucu uygulama programları arasında bilgi alışverişini sağlamak için datagramlar
kullanan bağlantısız bir protokoldür.
Datagramlar, veri yığınlarıdır. Bu sınıfta aşağıdaki 3 constructor bulunur :
Varsayılan kurucu, istemci uygulamalarının kullandığı bir datagram soketi oluşturur. Bu
durumda port numarası belirtilmez.
İkinci kurucu, datagram soket oluşturmak için belirtilen portu kullanır. Bu, genellikle sunucu
uygulamaları ile kullanılır.
Üçüncü kurucu, portun yanında internet adresi de belirtebilmeyi sağlar.
send() : Datagramları göndermek için kullanılır.
receive() : Datagramları almak için kullanılır.
getLocalPort () : Yerel port numarası
getLocalAddress () : Yerel IP adresi
close () : Soketi kapatır.
2.5. DatagramPacket Sınıfı
Bu sınıf, gönderilen ve alınan datagramları kapsüllemek için DatagramSocjet sınıfının nesnelerini
kullanır. Bu sınıfın, bir tanesi datagram soketinden alınan datagramlar için ve diğeri datagram soketi
üzerinden gönderilen datagramları oluşturmak için olmak üzere 2 tane kurucu vardır.
getAddress() : Hedef IP adresini okumak için kullanılır.
getPort () : Hedef port numarası
getLength () : Datagramda bulunan verideki baytların sayısı
getData () : Datagramda bulunan veriyi bir bayt dizisi tamponuna okumak için kullanılır.
setAddress (): Datagramın IP adresinin ayarlanmasını sağlar.
setPort (): Datagramın port numarasının ayarlanmasını sağlar.
setLength (): Datagramın uzunluğunun ayarlanmasını sağlar.
setData (): Datagramın gönderilecek verinin ayarlanmasını sağlar.
Örnek : Aşağıdaki örnek, sunucu ve istemci arasındaki ağ iletişimi uygulamasını gösterir. Mesajlar,
sunucuda pencere içine yazılır ve istemci tarafında ise gösterildikleri yere yazılırlar.
Bu örnek program, yerel bir makinede iki port arasında çalışmak üzere DatagramSocket kurucusu
tarafından kısıtlanmıştır. Programı kullanmak için bir pencerede aşağıdaki satır çalıştırılır :
Java datagram
Bu istemcidir. Daha sonra aşağıdaki satır çalıştırılır.
Java datagram 1
Bu ise sunucudur. Sunucu penceresi içine yazılan herhangi bir şey, Enter’a basıldıktan sonra istemci
penceresine gönderilir.
// Datagram örneği
import [Link].*;
class datagram {
public static int serverPort = 998;
public static int clientPort = 999;
public static int buffer_size = 1024;
public static DatagramSocket ds;
public static byte buffer[] = new byte[buffer_size];
public static void TheServer() throws Exception {
int pos=0;
while (true) {
int c = [Link]();
switch (c) {
case ‐1:
[Link]("Server Quits.");
return;
case '\r':
break;
case '\n':
[Link](new DatagramPacket(buffer,pos,
[Link](),clientPort));
pos=0;
break;
default:
buffer[pos++] = (byte) c;
}
}
}
public static void TheClient() throws Exception {
while(true) {
DatagramPacket p = new DatagramPacket(buffer, [Link]);
[Link](p);
[Link](new String([Link](), 0, [Link]()));
}
}
public static void main(String args[]) throws Exception {
if([Link] == 1) {
ds = new DatagramSocket(serverPort);
TheServer();
} else {
ds = new DatagramSocket(clientPort);
TheClient();
}
}
}
3. Web ile İlgili Sınıflar
[Link] paketi ayrıca Web’e özgü uygulamaları destekleyen sınıflar da sunar.
3.1. URL Sınıfı
Web üzerinde kaynakları bulabilmek için standart bir yol sunar. [Link] sınıfı web üzerindeki
nesneleri kapsüller.
Kaynak ismi
Protokol tanıtıcı http :// [Link]
openConnection() : Bir bağlantı oluşturur ve bir akım döndürür.
getContent () : Bir bağlantı oluşturur ve içeriği okur.
getFile () : URL’nin dosya ismi kısmını döndürür.
getHost () : URL’nin makine ismi kısmını döndürür.
getPort ():URL’nin port numarası kısmını döndürür.
getProtocol ():URL’nin protokol ismini döndürür.
getRef ():URL’nin referans kısmını döndürür.
equals (Object) : 2 URL nesnesinin aynı kaynağı gösterip göstermediğini test eder.
openStream() : Bir bağlantı oluşturur ve okumak için bir akım döndürür.
Örnek : Aşağıdaki örnekte [Link]’nin misyon sayfasına bir URL oluşturulur ve sonra
özellikleri incelenir.
import [Link].*;
class ag2 {
public static void main(String args[]) throws MalformedURLException {
URL hp = new URL("[Link]
[Link]("Protocol: " + [Link]());
[Link]("Port: " + [Link]());
[Link]("Host: " + [Link]());
[Link]("File: " + [Link]());
[Link]("Ext:" + [Link]());
}
}
3.2. URLConnection Sınıfı
Web üzerindeki aktif http bağlantılarını kapsüller. Soyut bir sınıftır. Tek bir URL’den URLConnection
nesneleri oluşturulabilir ve birden fazla bağlantıyı aynı anda tutabilirsiniz. URLConnection kurucusu
protected türündedir. Bu nedenle, bir URLConnection nesnesi oluşturmak için, önce bağlantıyı açmak
zorundayız. Bunu yapmak için openConnection() metodu kullanılır. Bu sınıf, bir URLConnection
nesnesinin varsayılanlarını, sorgularını ve o anki ayarlarını değiştirmek için çeşitli metotlar sunar.
connect() : Bir iletişim bağlantısı oluşturur.
getDate() : Tarihi alır.
getExpiration() :URL’nin bitiş tarihini alır.
getInputStream() : Kaynağı okumak için kullanılabilecek “InputStream” akımını alır.
getLastModified () : Son değiştirilme tarihini alır.
getURL() : Bağlantı oluşturmak için kullanılan URL’yi alır.
Kısaca URLConnection sınıfı Web nesneleri ve Web nesnelerine bağlantılar hakkında bilgiler edinmek
için kullanılır. HttpURLConnection sınıfı http parametrelerine direkt erişim sağlar. Bu URLConnection
sınıfının alt sınıfıdır.
Örnek : Bir URL nesnesinin openConnection() metodunu kullanarak bir URLConnection oluşturulur ve
sonra belgenin özelliklerini ve içeriğini incelemek için kullanılır.
// URLConnection Örneği.
import [Link].*;
import [Link].*;
import [Link];
class ag3
{
public static void main(String args[]) throws Exception {
int c;
URL hp = new URL("[Link]
URLConnection hpCon = [Link]();
// tarihi al
long d = [Link]();
if(d==0)
[Link]("No date information.");
else
[Link]("Date: " + new Date(d));
// içerik tipini al
[Link]("Content‐Type: " + [Link]());
// bitiş tarihini al
d = [Link]();
if(d==0)
[Link]("No expiration information.");
else
[Link]("Expires: " + new Date(d));
// son değiştirme tarihini al
d = [Link]();
if(d==0)
[Link]("No last‐modified information.");
else
[Link]("Last‐Modified: " + new Date(d));
// içerik uzunluğunu al
int len = [Link]();
if(len == ‐1)
[Link]("Content length unavailable.");
else
[Link]("Content‐Length: " + len);
if(len != 0) {
[Link]("=== Content ===");
InputStream input = [Link]();
int i = len;
while (((c = [Link]()) != ‐1)) { // && (‐‐i > 0)) {
[Link]((char) c);
}
[Link]();
} else {
[Link]("No content available.");
}
}
}
URLEncoder Sınıfı
Bu sınıf, metindizgilerini, URL’nin bir parçası olarak kullanılabilecek uygun formata dönüştürür. Bu
sınıf metin içindeki boşlukları (+) işaretlerine çeviren encode() metodunu bulundurur. Özel karakteleri
çevirmek için kaçma modu olarak yüzde işaretini (%) kullanır.
ContentHandler Sınıfı
MIME türündeki verileri işler ve çıkarır. MIME, Çok Amaçlı İnternet Posta Uzantısı anlamına
gelmektedir. Farklı türde internet nesneleri tanıma yöntemidir. MIME, ses, resim, video gibi farklı
nesne türlerini içerir. ContentHandler sınıfı, görüntüleyicilerin MIME türlerini işleyebilmesini sağlar.
Bir URLConnection nesnesinden MIME türünde bir nesne çıkaran getContent() metodunu içerir.
SAKARYA ÜNİVERSİTESİ
Java Programlama
Hafta 12
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak
hazırlanan bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri
mekanik, elektronik, fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
1. Veritabanı
Veritabanı bir dosyada elektronik olarak depolanmış düzenli bilgi kümeleridir. Microsoft Access,
Microsoft FoxPro, MYSQL, Oracle ve SQL Server gibi çeşitli veritabanı programları kullanılarak güçlü
veritabanları oluşturulabilir. Veritabanı uygulaması, bir veritabanının alan ve kayıtlarını alarak bunları
kullanıcılar için anlamlı bir biçimde görüntüleyen bir programdır. Kayıtları aramak, silmek, yazdırmak,
eklemek bir veritabanı uygulamasının temel komutlarıdır.
1.1. Temel SQL Komutları
Bu bölümde temel SQL komutları ile veritabanını sorgulayarak veri alma, sıralama, güncelleştirme,
silme gibi işlemlerinin nasıl yapıldığını inceleyeceğiz.
SELECT İfadesi
SELECT ifadesi veritabanından bilgi seçmek için kullanılır. Genel ifadesi aşağıdaki şekildedir.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ismi WHERE Koşul
ORDER BY Siralanacak_sütun [ASC / DESC]
Temel SELECT İfadesi : SELECT ifadesinin en basit şekli,
SELECT * FROM Tablo_ismi
Buradaki (*) tablodaki tüm sütunları (alan) seçecektir.
Belirli Sütunların Seçilmesi : Tablodan istenilen sütunlar seçiilebilir.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ismi
WHERE İfadesi : Koşulu sağlayan bilgilerin tablodan seçilmesini sağlar.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ismi WHERE Koşul
Koşullarda kullanılan operatörler :
Karşılaştırma Operatörleri =, <>, <, <=, >, >=
Mantıksal Operatörler NOT, OR, AND
Alfabetik Operatörler LIKE, NOT LIKE
Değer IN, NOT IN
Değer Aralıkları BETWEEN, NOT BETWEEN
Bilinmeyen Değerler IS NULL, IS NOT NULL
ORDER BY İfadesi : Satırları sıralamak için kullanılır. ASC seçeneği, artan sırada (yani A Z, 0 9),
DESC seçeneği azalan sırada (yani Z A, 9 0) sıralama yapmak için kullanılır.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ismi
ORDER BY Siralanacak_sütun [ASC / DESC]
INNER JOIN İfadesi
SELECT ifadesi, bilgileri yalnızca bir tablodan seçti. Halbuki birçok uygulama birden çok tablo
kullandığı için, birden çok tablodan gelen bilgilerin birleştirilmesi gereklidir. 2 çeşit birleştirme vardır.
İç ve dış birleştirme. İç birleştirme, yalnızca birleştirme koşulunun True (Doğru) olduğu satırları
verecektir.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ 1
INNER JOIN Tablo_ 2
ON Tablo_1.Sütun = Tablo_2.Sütun
INSERT İfadesi
INSERT ifadesi, bir tabloya yeni bir kayıt ilave etmek için kullanılır.
INSERT INTO Tablo_ismi (Sütün_ismi_1, Sütün_ismi_2, .....)
VALUES (Değer1i Değer2,......)
UPDATE İfadesi
UPDATE ifadesi, bir tablodaki bilginin değerlerinin değiştirilmesine olanak sağlar.
UPDATE Tablo_ismi
SET Sütün_ismi_1=Değer1, Sütün_ismi_2=Değer2, .....)
WHERE Koşul
DELETE İfadesi
DELETE ifadesi, bir tablodaki satır(lar)ın silinmesini sağlar.
DELETE FROM Tablo_ismi
WHERE Koşul
2. JDBC
Java da veri tabanı uygulamaları geliştirmeyi sağlayan API (Application Programming Interface)
JDBC(Java Database Connectivity) dir. Bu API biz proramcılara veri tabanına erişmek ve işlemek için
bir çok arabirim sunmaktadır. JDBC API kullanarak yazdığımız uygulamalar SQL ifadelerini çalıştırmayı
sonuçları nesne bazında elde etmeyi ve veriler üzerinden işlem yapmaya olanak sağlamaktadır. JDBC
API aynı zamanda birçok veri kaynağıyla aynı anda iletişim kurmayı da sağlamaktadır. Kısaca JDBC API
veritabanını temsil edip aynen veritabanı üzerinde gerçekleştirilen tüm işlemleri(tabloları sorgulama,
stored prosedürleri kullanma, triggerlarla ,indexlerle çalişma vs.) uygulama bazında gerçekleştirmeyi
sağlar . Veritabanından çekilen veriler bu API sayesinde nesne mantığıyla işlenmaktedir.
Üzerinde durulması gereken diğer önemli bir husus da JDBC sürücüleridir. Sürücüler her veritabanı
yönetim sistemine özeldir ve uygulamalar ile veritabanı yönetim sistemi arasında kod alış verisini
sağlamaktadır. Yani veritabanı üreticileri JDBC API si ile uyumlu çalışarak veritabanı bağlantılarını
sağlayan sürücüleri kendileri üretmektedir. MySQL veritabanı yönetim sistemine erişmek için MySQL
JDBC sürücüsünü, Oracle ‘a erişmek için Oracle JDBC sürücüsünü ve Access’e erişmak için ise JDBC‐
ODBC sürücüsünü kullanmamız gerekmektedir. ODBC Microsoft tarafından geliştirilen ve Microsoft
platformunda veri tabanına erişmeyi sağlayan bir teknolojidir. Bu sürücülerden sadece JDBC‐ODBC
JDK ile gelmektedir diğerlerini üreticinin sitesinden indirmek gerekiyor.
3. JDBC kullanarak veritabanı uygulaması geliştirmek
JDBC veritabanına erişimi ve iletişimi sağlayan arabirim ve sınıflardan oluşmaktadır. Bunlardan en
önemlileri Driver ,Connection,Statement ve Resultset dir. Bu arabirimler kullanılarak temel veritabanı
işlemleri gerçekleştirilir.
Bu arabirimleri veritabanı üreticileri kendi ürünlerine özgü implemente etmektedir. Bize düşen
sadece arabirimleri kullanmaktır arka planla pek fazla ilgilenmemiz gerekmiyor.
Driver vasıtasıyla uygulama ile veritabanı arasında bağlantı sağlanır SQL sorguları da Statement
içerisinde nesne mantığıyla işlenerek veri tabanı üzerinde sorgular oluşturulur ve bu sorguların
çalıştırılmasıyla uygulamada kullanabileceğimiz veri tabanı bilgilerini Resultset ‘de depolarız ve veri
ihtiyaci böylelikle karşılanmış olur.
3.1. Yüklenecek sürücüler
Yapılması gereken ilk işlem bağlanacağımız veri tabanına özgü sürücüleri uygulamaya yüklememiz
gerekir. Bunu
[Link](“JDBCDriverClass”)
ile sağlıyoruz. Kullanılacak sürücüler
Access [Link]
MySQL [Link]
Oracle [Link]
Bu sınıflar jar içerisinde paketlenmiş durumdadır .Uygulamalarımızda bu sınıflardan yararlanmak için
jar dosyalarının classPath ‘e eklenmesi gerekiyor.
3.2. Bağlantı Oluşturmak
İkinci adım olarak veri tabanına bağlanmak için bu işlemi DriverManager sınıfının statik yordamı olan
getConnection(databaeUrl) metoduyla yapılır.
Connection connection=[Link](databaseUrl)
bu ifadede kullanılan databaseUrl parametresi veritabanına özgüdür.
Access jdbc:odbc:datasource(veritabanı ismi)
Oracle jdbc:oracle:thin :@hostname:port# OracleDBSID
MySQL jdbc:mysql://hostname/veritabanı ismi
port numarası oracle ‘ın hangi porttan dinleme yaptığını gösterir oracleDBSID ise veritabanı ismine
karşılık gelmektedir.
3.3. Statement (ifade ) oluşturmak
Stament sınıfı sorgular oluşturmayı ve bunu connection üzerinden çalıştırmayı, aynı zamanda
sorgular ile çekilen verileri Resultset ile elde etmemizi sağlamaktadır.
Statement statement =[Link]();
bu ifade ile sorguları işletecek Statment nesnesi oluşturulur.
3.4. Sorguları calıştırmak
Statement nesnesini oluşturduktan sonra bu nesne üzerinden sorguyu çaliştırmak için :
Resultset resultset=[Link](Sorgu ifadesi);
3.5. Resulset’i işlemek
Resulset nesnesi veri tabanındaki tabloyu temsil [Link]şlangiçta bu nesne null’u
göstermektedir. Bu nesnenin Next() metodunu cağrılarak her seferinde tablonun bir sonraki satırına
ilerlenir.
while([Link]())
[Link]([Link](1) +” “+ [Link](2));
getstring(index) ile o an üzerinde bulunan satırın ilgili sütunları okunur. Her bir döngüde bir sonraki
satıra ilerlenir.