İleri Programlama Dersi 4. Ünite Özet

Java’da Sınıf Tanımlama

Giriş

Bu ünitede üye değişkenler, üye metotlar ve yaratıcı metotlar (constructors) tanımlayarak kendi sınıflarımızı nasıl oluşturabileceğimizi ve bu sınıflardan nesneler yaratıp bu nesneleri kullanmasını öğreneceğiz. Görevini tamamlayan nesnelerin otomatik olarak çöp toplayıcısı tarafından nasıl temizlendiğini kavrayacağız. Tüm nesneler arasında ortak paylaşılan sınıf üyeleri tanıdıktan sonra, sınıfların iç içe tanımlanmasını, başka bir ifadeyle, bir sınıfı başka bir sınıf içinde tanımlamayı göreceğiz. En son olarak kategorik değişkenleri tutmaya yarayan enumation tipi üzerinde duracağız.

Sınıflar

Java programlama dilinde her unsurun nesnelerden oluştuğunu belirtmiştik. Bu nesnelerin ayrıntılı planlarına ise sınıf denir. Örneğin, bir akıllı telefonun ayrıntılı tasarımını sınıfa benzetirsek, bu tasarımdan üretilen ve satışa sunulan çeşitli renklerde ve özelliklerdeki akıllı telefonlarda bu sınıfa ait nesnelerdir. Bu nedenle tasarısı aynı olmasına rağmen bir akıllı telefon mavi renkte iken diğer biri pembe renkte olabilir. Java programlama dilinde bir sınıf basit anlamda iki unsurdan oluşur. İlk unsur sınıfın durumunu tarif eden alanlardır (üye değişkenler). İkincisi ise değişkenler üzerinde işlemler yapan metotlardır. Bunlara ek olarak, sınıfı yaratırken kullandığımız, özel bir metot olan yaratıcı metot vardır. Bu metodun ismi sınıfın ismi ile birebir aynıdır ve değer döndürmez. Java’da sınıf tanımlaması şu şekilde yapılır:

public class Sınıfİsmi {

// alanlar (fields)

// yaratıcı metot (contructor)

// metotlar (methods)

}

Yukarıdaki örnekte, kaşlı ayraçlar arasında bulunan bölüm sınıf gövdesidir. Sınıf gövdesi bu sınıftan yaratılmış bütün nesnelerin hayat döngüsünü sağlayan tüm kodları içerir. Alanlar (üye değişkenler) sınıfın durumunu belirtir. Yaratıcı metot nesneleri ilk nesneyi yaratırken çalışır. Metotlar ise sınıfın ve o sınıftan yaratılmış nesnelerin davranışını modeller.

Java’da sınıf tanımlarken kullanılan bileşenleri sırasıyla aşağıdaki gibi listeleyebiliriz:

  • Erişim niteleyiciler (public, private veya protected)
  • Erişim dışındaki diğer niteleyiciler (final, static, veya abstract)
  • Class anahtar sözcüğünden sonra sınıfın adı
  • Eğer varsa extends anahtar sözcüğünden sonra yazılmak üzere, üst sınıf
  • Eğer varsa implements anahtar sözcüğünden sonra yazılmak üzere, sağladığı arayüz ya da arayüzlerin isimleri
  • Son olarak kaşlı ayraçlar { } içine alınmış sınıf gövdesi

Aşağıda listelen niteleyiciler hem sınıf, hem üye değişken hem de üye metot tanımlanırken kullanılan anahtar sözcüklerdir. Bu sınıf, metot ya da değişkenlere erişim kısıtlaması getirmek için kullanılır. Tablo, aşağıdan yukarıya olmak üzere, en serbestten en kısıtlayıcı olan niteleyiciye göre sıralanmıştır. Bu tablodaki erişim niteleyiciler dışında niteleyicilerde vardır ama bunlara erişim dışında kalan niteleyiciler denir.

  • public
  • protected (Dış dünya için kullanılmaz.)
  • --- (Alt sınıf ve dış dünya için kullanılmaz.)
  • private (Alt sınıf ve dış dünya için kullanılmaz.)

Genel olarak değişkenleri üçe ayırabiliriz:

  1. Üye değişkenler: Sınıfların içindeki alanlar
  2. Yerel değişkenler: Bir metot içindeki veya kaşlı ayraçlar içinde yazılmış kod bloğunun içindeki değişkenler
  3. Parametreler: metot tanımlarken kullandığımız metot isminden sonra gelen ayraçlar içinde tanımlanan değişkenler

Üye değişken tanımlarken kullanılan bileşenleri sırasıyla listeleyecek olursak:

  • Niteleyiciler (bu örneğimizde private ve final anahtar sözcükleri)
  • Alanın tipi (bu örneğimizde int, ama String, dizi ya da başka bir sınıfta olabilirdi)
  • Alanın ismi (bu örneğimizde en ve boy)

Metot tanımlarken kullanılan bileşenleri sırasıyla listeleyecek olursak:

  • Niteleyiciler (bu örneğimizde public anahtar sözcüğü)
  • Döndürdüğü değerin tipi (bu örneğimizde int ama void, dizi ya da başka bir nesne de olabilirdi.)
  • Metot ismi (bu örneğimizde hesaplaAlan ve hesaplaÇevre). Genel olarak metot isimleri küçük harf ile yazılan bir fiil ile başlar. Eğer ikinci bir kelimesi varsa bu ikinci kelime büyük harf ile başlayan sıfat veya isim olur.
  • Parametre listesi, parantezler içine yazılır.
  • İstisna listesi, throws anahtar sözcüğünden sonra yazılır.

Bir metodun ismi ve parametre listesinin birleşimine o metodun imzası denir. İsmi aynı olan metotlar tanımlayabiliriz ama bunların imzası farklı olmalıdır. Derleyici imzası aynı olan iki metodu aynı anda tanımlamaya izin vermez. Aynı isimli metotların kullanılmasına metotların yüklenmesi (overloading methods) adı verilir.

Yaratıcı metotlar, standart metotlar gibi tanımlanırlar. Fakat bu tür metotlar değer döndürmezler. Argümansız olan metotta, nesneyi yaratırken hiçbir bilgi metoda iletilmemektedir. Argümanlı olan metotta ise argümanlar yaratıcı metota bilgi olarak aktarılmaktadır.

Eğer üst sınıfa ait bir metodu kendimize göre yeniden tanımlıyor isek o metodun üstüne @Override işaretini koymak tavsiye edilir. Böyle bu metodun üst sınıfına ait bir metot olduğu ayırt edilmiş olur.

Üç nokta yan yana ifadesini sadece metotların parametreleri (argümanları) için kullanılabilir. Dolayısıyla üye değişkenler ve yerel değişkenler için bu gösterimi kullanmak mümkün değildir.

SınıfAdı::Fonksiyon ifadesi bir lambda ifadesidir ve Java 8’in bir özelliğidir. Parametresi metot olan metotlar yazmak için kullanılır. Bir anlamda değişken olarak bir metot kullanmayı mümkün kılan bu yeni teknoloji bu ünitenin konularının dâhilinde değildir.

Nesneler

Tipik bir Java programında birçok nesne yaratılır ve bu nesneler birbirleriyle etkileşim içinde çalışarak birtakım işleri yerine getirirler. Bir nesne kendisine tanımlanan işi tamamladığında ise bu nesnenin tükettiği ve kullandığı kaynak boşa çıkarılır. Böylece boşa çıkan bu kaynaklar başka nesnelerin kullanımına açılmış olur.

Her sınıfın en az bir tane yaratıcı metodu vardır. Eğer sınıfın içinde açık olarak hiç yaratıcı metot tanımlanmamış ise, hiç argümanı olmayan bir yaratıcı metot Java derleyicisi tarafından otomatik olarak sağlanır. Buna varsayılan yaratıcı metot denir. Varsayılan yaratıcı metot, üst sınıfın argümansız yaratıcı metodunu çağırır. Bu yüzden üst sınıfın argümansız bir yaratıcı metodu yoksa derleyici bu durumda hata verir. Ancak, açık olarak belirtilmemiş üst sınıf olmaması durumunda, örtük olarak üst sınıf java.lang.Object sınıfıdır ve bu sınıfın argümansız yaratıcı metodu vardır

Çöp Toplayıcısı Java programlama dilinde yarattığınız nesnelerin kayıtlarını tutup daha sonra nesnelerle işimiz bittiğinde onları yok etmekle uğraşmanıza gerek yoktur. Bu işlem çöp toplayıcısı tarafından otomatik olarak yapılır. Eğer bir nesne artık kullanılmıyorsa otomatik olarak silinir. Bu işleme çöp toplama denir. Çöp toplama işlemi periyodik olarak uygun zamanlarda otomatik yapılır ve bellek temizlenir. Java’da birkaç çeşit çöp toplayıcısı vardır ve programcı bunlardan hangisi kullanmak istediğini seçebilir.

Üye metotlar ve yaratıcı metotlar için, şu anki nesneye erişim “this” anahtar sözcüğü ile yapılır. En sık olarak üye değişken isimleri ile yaratıcı metodun parametre listesindeki değişkenleri ayırt etmek için kullanılır. this anahtar sözcüğü ile aynı isimlere sahip olmalarına rağmen farklı üye değişkenlerine farklı değişkeni atayabiliriz. Bir başka kullanım ise this anahtar sözcüğünün bir yaratıcı metodu çağırmak için kullanılabilmesidir.

“süper” anahtar sözcüğü, this anahtar sözcüğü ile aynı mantıkta çalışır fakat bu sefer üst sınıfın üyelerine erişim için kullanılır.

Bir sınıftan yaratılmış tüm nesneler için ortak olmasını istediğimiz değişken ya da metotları tanımlarken önüne “static” anahtar sözcüğünü koyarız. Böylece bunlar sınıf üyeleri olmuş olur

Şu ana kadar hep static olmayan üye değişkenleri ve üye metotları kullandığımızı hatırlayalım. Bunlara ise örnek (instance) üye denir. Her yeni yaratılan nesne için örnek değişkenler farklı olabilmektedir. Bazı durumlarda bütün nesneler için ortak bir değişken tanımlamak isteyebiliriz. Bu tür değişkenlere sabit alanlar veya sınıf değişkenleri denir. Bu tür değişkenlere erişmek için artık new ile yeni nesne yaratmamıza gerek yoktur. Bunlara sınıfın ismi ile erişilebilir. Bu tür değişkenler genellikle sabit değerleri saklamak için kullanılır. Örneğin java.lang.Math sınıfı içinde e sayısını tutan değişken sınıf değişkenidir. Bu değişkene erişmek için new Math() dememize gerek yoktur. Direk olarak Math.E ifadesi ile erişebiliriz. Örneğin, System.out.println(Math.E); kodu ekrana, 2.718281828459045 değerini yazdırır.

Nasıl static anahtar sözcüğü ile değişken tanımlayabiliyorsak, aynı şekilde metot tanımlayabiliriz. java. lang.Math sınıfı içindeki mutlak değer fonksiyonu buna bir örnektir. Değişkenlerde olduğu gibi, bu metotlara erişmek için new anahtar sözcüğüne gerek yoktur. Aşağıdaki örnek kod, -5 değerinin mutlak değerini hesaplar ve ekrana 5 yazdırır.

public static void main(String[] args) {

System.out.println(Math.abs(-5));

}

Bu tür metotlar genelde sadece parametre listesindeki değişkenler üzerinde anlamlı işlemler yapan yardımcı metotlardır. java.lang.Math sınıfı içinde minimumu bulan, maksimumu bulan, ondalıklı sayıları yuvarlayan, gibi bir çok static metot örneği bulunabilir. Eğer static olarak tanımlanmış değişkenlere ilk değer atamak istersek ve bu tek satırdan daha uzun sürecek bir işlemse bunu static kod bloğu içinde yaparız. Örneğin, Anadolu Üniversitesinin harf notlarının katsayı değerlerini içeren static bir dizimiz olsun. Bu dizinin ilk değerlerini aşağıdaki örnekteki atayabiliriz. static metotlar, static olmayan üye değişkenlere erişemezler

İç İçe Sınıflar

Java programlama dilinde bir sınıf tanımı içerisinde başka bir sınıfı tanımlamak mümkündür. Bu şekilde tanımlanan sınıfa iç sınıf denir. İç sınıf dış sınıfın bir üyesidir. Bir iç sınıf, dış sınıfın diğer bütün üyelerine erişebilir. Bu tür iç sınıf tanımlamasını birbirleriyle alakalı sınıfları bir araya toplamak için kullanabiliriz. Böylece geliştirilen kodun okunabilirliği ve bakımı kolaylaşır.

Kaşlı ayraçlar içine alınmış kod bloğunda da sınıf tanımlaması yapılabilir. Yerel sınıflar, iç sınıflara benzerler. İç sınıflarda olduğu gibi, yerel sınıflarda tanımlandıkları dış sınıfın bütün üyelerine erişebilirler.

Ancak bir arayüzü sağlayan ya da bir üst sınıfı extend ifade ise genişleten bir alt sınıf anonim olarak tanımlanabilir. Bu durumda sınıfın tanımlaması ve yaratılması aynı anda gerçekleşir. Anonim sınıf tanımlaması sadece bir arayüzü implement eden ya da bir sınıfı extend eden sınıflar için mümkündür.

Kategorik değişkenleri saklamak için kullanılırlar. Örneğin, bir insana ait kan grubu bilgisini düşünelim. Bir insanın kan grubu A, B, AB veya 0 olabilir. Bu tür bir veriyi modellemek için Enum tanımlaması yapmak uygundur. Trafik ışığı renkleri, haftanın günleri gibi önceden belirli sabit değerlerden oluşan verileri temsil etmek için Enum tipi kullanılır. Aşağıda Enum tiplerinden biri görülmektedir:

public enum KanGrubu {

A, B, AB, O

}