Bundan önceki örneklerimizde bir sınıfın yazıldıktan sonra, başka bir sınıf içerisinde ya da örneklerde yaptığımız gibi
main metodu içerisinde kullanılabildiğini görmüştük. Bazı sınıflar otomatik olarak çalıştırılabilmek amacıyla da 54
yazılabilirler. Bir sınıfın otomatik olarak çalışabilmesi için içerisinde main metodu olması gerektiğini zaten biliyoruz.
İşte bu şekilde main metodu içerisinde bir sınıf, kendisi türünden nesne yaratıp bunu kullanabilir.
İşin özü aslında şudur: Bir sınıf yazıldıktan sonra, bu sınıf türünden nesneleri istediğimiz her metod ya da her sınıf
içerisinde artık yaratıp kullanabiliriz. Bu genel kuralı bilirsek, zaten sınıf nesnelerinin ne zaman ve nerede
yaratılacağına dair bir problemimiz de kalmaz.
Aşağıdaki örneğimizde, matematikte kullanılan karmaşık sayılara ilişkin değer ve metodları barındıran bir sınıf
yazacağız. Bu sınıf aynı zamanda “main” metodu içerecek ve kendisi türünden nesneler yaratarak bu nesneler
üzerinde işlemler yapacak:
Şimdi bu örneğimizi biraz inceleyelim. Sınıfımızın iki adet başlangıç metodu olduğunu görmekteyiz. Bu metodlardan
birtanesi, 6. satırda tanımlanmakta ve hiçbir parametre almadan yaratılan KarmasikSayi nesnesinin “gercel” ve
“imajinel” isimli değişkenlerini 0.0 değerine eşitlemektedir. Diğer başlangıç metodu ise 11. satırda tanımlanmaktadır 55
ve nesne yaratılırken kendisine verilen parametreleri kullanarak “gercel” ve “imajinel” değişkenlerinin değerlerini
atamaktadır.
NOT: Sınıfın kendisine ait olan değişken ve metodlarını sınıf içerisinde kullanırken, bu değişken ve metodların
başına “this.” eklemiş olduğuma dikkat ediniz. Daha önce de söylediğim gibi this anahtar sözcüğü sınıfın kendisini
temsil eder. Örneğin 12. satırda “this.gercel” ifadesi, “o anda içerisinde bulunduğumuz sınıfa ait olan gercel isimli
degiskeni” temsil etmektedir.
16. satırda tanımlanan “topla” isimli metod parametre olarak başka bir “KarmasikSayi” nesnesi alarak, bu sayının
“gercel” ve “imajinel” değişkenleri ile sınıfın kendi “gercel” ve “imajinel” değerleri toplamını elde eder ve bu
değerlerle, “sonuc” adında yeni bir “KarmasikSayi” nesnesi yaratarak bu değişkeni 19. satırda geri döndürür. Buna
benzer şekilde 22. satırda yazılmış olan “cikart” metodu da aynı işlemi çıkartma için yapar. Ancak bu metod biraz
daha ilginç bir yöntemle değer döndürmektedir. Bu sefer sonucu tutacak ayrı bir değişken yaratmak yerine, 23.
satırda olduğu gibi “return” anahtar sözcüğünün önünde yeni bir “KarmasikSayi” nesnesi yaratılarak hemen o anda
döndürülür. Bu yöntemde arada “sonuc” gibi başka bir değişken içerisinde “KarmasikSayi” nesnesi yaratma ihtiyacı
ortadan kalkmaktadır.
Yazdığımız Sınıfların toString metodu:
Dikkat ederseniz 35. satırda “toString” adında ilginç bir metod yer almaktadır. Bu metod aslında main metodu
içerisinde hiç çağrılmamıştır. Ancak ilginçtir ki, 47. satırdaki “sayi1” isimli sınıf değişkeni ekrana yazılmak istendiği
zaman sanki bu metod çağrılmaktadır. Çünkü ekranda toString metodunun döndürdüğü String ifadesi yazılmaktadır.
Aslında gerçekten de 47. satırda sayi1 değişkeninin ekrana basıldığı noktada otomatik olarak bu metod çağrılır.
Yazılan tüm sınıflara aslında toString metodu da eklenebilir. Eğer
“String toString()”
prototipini bozmadan sınıfınız içerisinde bir toString metodu yazarsanız, bu sınıfa ilişkin bir sınıf değişkenini ekrana
basmak istediğinizde bu metod otomatik olarak çağrılmaktadır. Ancak metodun içini istediğiniz gibi yazabilirsiniz.
Eğer yazdığınız sınıf içerisinde bu metodu eklemez ve bu sınıf türünden bir değişkeni ekrana basmak isterseniz, o
zaman Java otomatik olarak bir toString metodunu kendisi yazacak ve buna ilişkin bir String değeri de dödürecektir.
Ancak bu değer oldukça anlaşılmaz bilgiler içermektedir. Özetle sınıfınızı nasıl ifade etmek istiyorsanız, buna ilişkin
String toString() prototipli bir metod yazabilirsiniz.
Öntanımlı Java Sınıflarının Kullanımı:
Dersimizin bundan sonraki kısmında yeni bir konuya geçmeden önce, Java’da öntanımlı bazı sınıflara ilişkin örnekler
yapmakta yarar görüyorum. Göreceğimiz bu sınıflar, yazacağımız programlarda birçok yükü üzerimizden almakta
ve bize bazı yararlı hazır metodlar sunmaktadır. Bu nedenle işimizi görecek ve daha önceden yazılmış bu hazır sınıf
ve metodları kullanarak zaman kaybı ve zahmetten kurtulabiliriz.
Bir konuda sizleri uyarmak isterim: Burada bu öntanımlı java sınıflarının tüm metodlarını detaylı bir şekilde
göstermek yerine, bu sınıflar hakkında bilgi sahibi olmanızı ve sadece birkaç metod kullanımıyla sınıfı sizlere
tanıtmayı hedefledim. Kendi uygulamalarınız için burada genel olarak öğrenmiş olduğunuz bu sınıfların size uygun
metodlarını ve burada gösterilmeyen başka öntanımlı sınıfları java dökümantasyonu ve internette yapacağını
aramalar ile bulabilirsiniz. Java dökümantasyonunun online halini:
“http://java.sun.com/j2se/1.4.2/docs/api/index.html” adresinde bulabilirsiniz.
Özetle buradaki örnekleri sizlere sadece neyi nerede arayacağınızı bilmeniz açısından veriyorum. Şimdi bu sınıfları
incelemeye başlayalım.

Math Sınıfı:
Bu sınıf çeşitli matematiksel işlemleri yapabileceğimiz metodları sunmaktadır. Bu metodlar içerisinde sin, cos, tan,
kuvvet alma, kök alma v.b. metodlar bulunmaktadır. Bu sınıfı kullanabilmeniz için uygulamalarınızın başında
herhangi bir kütüphaneyi “import” etmenize gerek yoktur. Aşağıda Math sınıfınının bazı metodlarının kullanımına
ilişkin bir örnek verilmektedir. Bu örnek, daha önce yapmış olduğumuz karmaşık sayı sınıfının biraz daha
geliştirilmiş hali ve Math sınıfının fonksiyonlarının kullanıldığı bir örnektir. Ayrıca bu sınıfa “aciHesapla” adında yeni
bir metod daha eklenmiş ve sınıfın içerisinde saklanan karmaşık sayının açı değerleri bu metod yardımıyla
hesaplanmıştır.56
Şimdi örneğimizi daha detaylı inceleyelim. Herşeyden önce genel bir noktayı vurgulamak istiyorum. Dikkat
ederseniz “KarmasikSayi2” sınıfının 23, 24, 27 satırlarında, “gercel” ve “imajinel” değerlerini “this.gercel” diyerek
doğrudan almak yerine bu değerleri 13 ve 16. satırlarda yazılmış olan “gerceliVer” ve “imajineliVer” metodları
yardımıyla alıyoruz. Bunun nedeni sınıfın veri elemanlarını korumak ve böylece sınıf hiyerarşisini düzgün bir şekilde
kurmak içindir.
Bu teknik bizlere oldukça önemli ve sağlam bir mekanizma sunar. Zaten dikkat ederseniz “gercel” ve “imajinel”
isimli veri elemanları da dışarıdan doğrudan erişimin engellenmesi amacı ile 7. satırda “private” olarak
tanımlanmıştır. Veri elemanlarına erişimin bu şekilde kontrollü olarak yapılması gerekir. Eğer bu elemanlara
erişilmek gerekiyorsa, bu işi doğrudan değil de set ve get metodları gibi metodlar yardımıyla yapmak gerekir.
Kullanıcıya sadece bu metodlar sunulmalı, sınıfın veri elemanlarına erişim ise metodlar içerisinde ve gerektiği gibi
yapılmalıdır.
23. satırda kullanılan “Math.pow” isimli metod 1. parametre ile aldığı sayının, 2. parametre ile aldığı sayı kadar
kuvvetini hesaplar ve sonucu geri döndürür. Bu metodu “gercel” ve “imajinel” kısımların karelerini hesaplamak için
kullandık. Bu karelerin toplamının da karekökünü, tahmin ettiğiniz gibi Math.sqrt metodu ile elde ettik. Yani özetle; 57
Math.pow değerleri ile elde edilen “gercel” ve “imajinel” kısımların karelerinin toplamını, Math.sqrt metoduna
paramtere olarak doğrudan göndererek sonucu da doğrudan geri döndürdük. Sizler de bol bol program yazdıkça
bu tip hızlı yazım tekniklerinizi geliştireceğinizden emin olabilirsiniz. Ancak pratik olması amacıyla kısa kodlar
yazarken bile kodunuzun okunabilir olmasına dikkat ediniz.
Örneğimizin 27. satırında kullandığımız “Math.atan2” isimli metod kendisine parametre olarak verilen “y” ve “x” gibi
iki sayının polar koordinatlarda sahip olduğu açı değerini hesaplayan bir metoddur. Yani aslında yaptığı işlem y/x
değerinin arktanjant değerini hesaplamaktır. Fakat geri dönen bu değer radyan cinsindendir. Bu nedenle, radyan
olarak elde edilen açı değeri 29. satırda yazılan “aciyiDereceVer” metodu ile derece olarak da elde edilebilir.
Hızlı bir şekilde listelemek gerekirse Math sınıfının bazı diğer metodları şunlardır:
int Math.abs(int a) a sayısının mutlak değerini geri döndürür. Aynı metodun
float, double ve long türler için de versiyonları vardır.
double Math.acos(double a) a sayısnın ters kosinüs değerini döndürür. Benzer şekilde
asin ve atan metodları da vardır.
double Math.cos(double a) a sayısnın cosinüz değerini geri döndürür. Benzer şekilde
sin metodu da vardır.
double Math.exp(double a) a sayısnın e sayısını kuvveti olarak hesaplar ve bu değeri
döndürür.
int Math.max(int a, int b) a ve b sayılarından büyük olanın değerini geri döndürür.
Benzer şekilde bu metodun double, int, float ve long
versiyonları da vardır.
double Math.random() 0 ile 1 arasında rastgele pozitif bir sayı üretir ve bu değeri
döndürür.
DecimalFormat Sınıfı:
Java ile yazdığımız programlarda sayısal değerler çoğu zaman anlaşılması zor ve gereksiz uzunlukta üretilir. Ancak
Java bizim için sayının ne kadar uzunlukta olması gerektiğini otomatik olarak bilemez ve bu nedenle en doğru ve
orjinal şekilleriyle bu değerleri üretmektedir. Eğer yukarıdaki örneği yazıp çalıştırdıysanız, elde edilen sonuçların (açı
değerleri gibi) virgülden sonra oldukça fazla miktarda basmak içerdiğini görmüşsünüzdür.
DecimalFormat sınıfı, sayıları istediğimiz gibi ifade edebilmemize olanak sağlar. Bu sınıfın kullanımına ilişkin bir
örnek yazalım:
Örneğimize dikkat edersek, “DecimalFormat” sınıfını kullanmadan önce 4. satırda olduğu gibi
“java.text.DecimalFormat” kütüphanesini programa dahil etmeliyiz. 9. satırda yaratılan bir DecimalFormat nesnesi
yapmak istediğimiz ifade biçimini String bir değer olarak tutmaktadır. Bu nesne yaratıldıktan sonra, nesne 58
aracılığıyla istenilen bir sayı “format” metodu kullanılarak 13. satırda olduğu gibi biçimlendirme yapılabilir. “format”
metodunun geri dönüş değeri String bir değerdir.
Sargı Sınıfları:
Java’da yaygın olarak kullanılan sınıflar arasında sargı sınıfları da vardır. Bu sınıflar aslında genel olarak aynı
prensiple kullanılır. Bı sınıfları kullanmaktaki amaç bilinen temel türleri (integer, float, double gibi) String türüne ya
da tersine, String türündeki bir ifadeyi temel türlere dönüştürmektir. Aslında bu tür sınıflara olan ihtiyacı örnek
üzerinde açıklarsak daha anlaşılır olacaktır.
Mesela en son yaptığımız “OndalikKisim” sınıfı örneğinde, 10. satırda tanımlanan “a” değişkeni içerisindeki değerin
biçimlendirilmiş hali String türünde elde edilmektedir. Ancak biz bu biçimlendirilmiş hal ile başka matematiksel
işlemler yapmak istediğimizde String türündeki bu sonuç işimize yaramayacaktır. Bu sonucun tekrar double türünde
elde edilmesi gerekir. Bunun için String türünde elde edilen bu değer “Double.parseDouble” metodu ile tekrar
double türüne dönüştürülebilir. Bu metodun örnek kullanımı:

double yeniBicim = Double.parseDouble(ikiHane.format(a));
..
şeklinde olacaktır. Bu dönüşümleri yapan diğer bazı sargı sınıfları ve metodları da şunlardır:
int Integer.parseInt(String str) str ile gelen String biçimindeki sayıyı integer
biçiminde geri döndürür.
String Integer.toString(int a) integer türündeki a sayısının String türünde
değerini geri döndürür.
double Double.parseDouble(String str) str ile gelen String biçimindeki sayıyı double
biçiminde geri döndürür.
String Double.toString(double a) double türündeki a sayısının String türünde
değerini geri döndürür.
float Float.parseFloat(String str) str ile gelen String biçimindeki sayıyı float biçiminde
geri döndürür.
String Float.toString(float a) float türündeki a sayısının String türünde değerini
geri döndürür.
String String.valueOf(int a) integer türündeki a sayısnın String değerini geri
döndürür. Aynı metodun double, float, ve long türünde
parametre alan versiyonları da vardır
ArrayList Sınıfı:
Daha önce öğrenmiş olduğumuz diziler konusundan bildiğimiz gibi bir dizi yaratıldıktan sonra artık otomatik olarak
boyutu değişmiyordu. Siz diziyi belirli bir uzunlukta açtıktan sonra dizinin tüm alanları doluysa, yeni bir eleman
eklemek için birtakım algoritmik yöntemler uygulamanız gerekir. Ya da diziden bir eleman çıkardığınız zaman, diğer
elemanları birer basmak geri kaydırmak gibi birtakım işleri de yapmanız gerekir.
“ArrayList” sınıfı bu tür görevleri otomatik olarak yapan ve bize dinamik olarak kullanabileceğimiz bir dizi
mekanizması sunan bir sınıftır. Eğer böyle bir diziye sahip olmak istiyorsanız aşağıdaki şekilde bir “ArrayList”
nesnesi tanımlamanız gerekir:
ArrayList dinamikDizi = new ArrayList();
Daha sonra bu nesneyi artık kendi dizinişmiş gibi düşünerek “ArrayList” sınıfının sunduğu metodlar yardımıyla
eleman ekleme, çıkartma ve bulma gibi işlemler yapabilirsiniz. Mesela “dinamikDizi” nesnesine eleman eklemek için:
dinamikDizi.add(“merhaba”);
ya da
int a = 3;
dinamikDizi.add(a); 59
ArrayList sınıfının yukarıda gördüğümüz gibi “add” isimli metodunun yanısıra diğer metodlarından bazıları da
şunlardır:
void remove(int index) Dizinin verilen indeks numarasındaki elemanını çıkartır ve
diziyi buna göre düzenler. Örnek kullanım:
int a = dinamikDizi.remove(2); //2.eleman siliniyor
int size() Dizinin içerisindeki elelman sayısını verir. Örnek kullanım:
int a = dinamikDizi.size();
Object get(int index) Dizinin index nolu elemanını geri döndürür. Örnek kullanım:
String str = dinamikDizi.get(0);
int indexOf(Object o) o ile temsil edilen nesnenin dizi içerisindeki indeks nuaarasını
geri döndürür. Eğer eleman dizide yoksa -1 geri döndürür.
Aşağıdaki “KayitListesi.java” uygulamamızda hem böyle bir dinamik dizi kullanımını, hem de bugüne kadar
öğrendiklerimizle gerçeğe oldukça yakın bir java uygulamasının yazımını görmekteyiz. Bu uygulama çalıştığında,
ekrana resimdeki gibi bir menü sunulmakta ve kullanıcının yaptığı seçimlerle kayıt ekleme, silme, kayıtları listeleme
gibi işlemler yapıldıktan sonra tekrar aynı menü ekrana gelmektedir. Kullanıcıya istediği zaman programdan
çıkabileceği bir seçenek de sunulmaktadır. 60 61
K