Sınıf Yapıları – III

Bundan önceki iki yazımızda sınıf yapılarına değinmiştik. Bir sınıfa dair tanımlamanın ne olduğu, sınıfların hangi parçalardan oluştuğunu, bir sınıftan nesne yaratmayı, this anahtar sözcüğünü ve nesne yaratırken izleyebileceğimiz alternatif yöntemleri işlemiştik.

Methodlar

Sınıflarla ilgili şimdi de sınıf içerisindeki methodların kullanımına değineceğiz. Öncelikle KaraAraclari sınıfımızın son halini buraya tekrar ekleyelim.

public class KaraAraclari {

	public int koltukSayisi;
	
	public String renk;
	
	public KaraAraclari() {
		System.out.println("Yeni bir araç yaratıldı (Parametresiz)");
	}
	
	public KaraAraclari(int kacKoltuk) {
		System.out.println("Yeni bir araç yaratıldı (1 parametreli)");
		this.koltukSayisi = kacKoltuk;
	}
	
	public KaraAraclari(int koltukSayisi, String renk) {
		System.out.println("Yeni bir araç yaratıldı (2 parametreli)");
		this.koltukSayisi = koltukSayisi;
		this.renk = renk;
	}

	public void hareketEt() {
		System.out.println("Hareket başladı");
	}

	public void dur() {
		System.out.println("Hareket bitirildi");
	}

	public void yonVer() {
		System.out.println("Yön verildi");
	}

}

Tekrar belirtmek gerekirse sınıfımız field, constructor ve method gruplarından oluşmaktadır. Bunları yukarıdaki koda bakarsanız yukarıdan aşağıya sıralı olarak göreceksiniz. Görüleceği üzere methodlarımız şu imzalar ile sınıfımızda bulunmaktadır.

  • hareketEt()
  • dur()
  • yonVer()

Hatırlarsanız bu sınıftan nesne(ler) yaratırken constructor methodlarımıza parametre geçtiğimiz örneklerimiz olmuştu. Bu parametreler sayesinde sınıf içerisindeki koltukSayisi ve renk fieldlarına değer atamış yani onları initialize etmiştik. Birbirinden farklı nesneler yaratıp, onlara farklı farklı isimler vermiştik. Bu yarattığımız nesneleri gerçek hayatta düşünürsek; tamamı hereket eden, durabilen ve yön değiştirebilen nesneler olurdu. Peki javada bu nesneleri nasıl hareket ettirir, nasıl durdurur ve nasıl yönlendirirdik? Bu sorunun kısa cevabı “Method çağrısı yaparak” olurdu. Yani methodlar belirli bir işlevi yerine getirmek üzere yazılmış kod bloklarıdır. TestClass sınıfı içerisinde bunu uygulamalı olarak görelim.

İsmi arac olan KaraAraclari tipinde bir nesne yaratacağız. Bunu yaparken parametresiz constructor kullanıyoruz. Bu tercihimizin tek sebebi kullanım kolaylığı. Nesneyi yarattıktan sonra arac. yazıp beklerseniz veya arac. yazıp ctrl+boşluk tuş kombinasyonunu kullanırsanız aşağıdaki gibi bir menünün açıldığını göreceksiniz. Bu özelliğin ismi auto-complete yani otomatik tamamlamadır.

Bu menü, sınıf ile ilgili olarak erişebileceğimiz field ve methodları listelemektedir. Bunlardan bazıları java tarafından bize verilmiştir. Bunların detayına değinmeyeceğim. Ancak listeye baktığınızda tanıdık isimler de göreceksiniz. Burada az evvel nasıl kullanacağımıza dair cevap aradığımız methodların da listelendiğini görüyoruz. O halde bunlardan bir tanesini seçelim ve TestClass sınıfımızı şu hale getirelim.

public class TestClass {

	public static void main(String[] args) {
		
		KaraAraclari arac = new KaraAraclari();
		
		arac.hareketEt();

	}
}

Yukarıdaki kodu çalıştırdığımızda şu şekilde bir çıktı elde ederiz.

Pekala, başka bir methodu daha çağırabiliriz. Hareket ettirdiğimiz aracımıza yön verelim ve arkasından durduralım.

public class TestClass {

	public static void main(String[] args) {
		
		KaraAraclari arac = new KaraAraclari();
		
		arac.hareketEt();
		arac.yonVer();
		arac.dur();

	}
}

Peki bu defa çıktımız nasıl olacaktır? Çalıştırmadan önce tahmin etmenizi öneririm. Böylece aktif olarak kodu takip etmiş olacaksınız. Bu programın çıktısı aşağıdaki gibi olacaktır.

Özet olarak bir method çağrısı yapmak için, önce değişkenimizin (nesne, obje, object, instance) ismini yazıyoruz ve arkasından çalıştırmak istediğimiz methodun ismini yazıyoruz.

Şimdi sınıfımıza iki ayrı method daha ekleyeceğim. Bunların içerikleri aşağıdaki gibidir.

	public void gaz() {
		System.out.println("Gaz verildi");
	}
	
	public void fren() {
		System.out.println("Fren yapıldı");
	}

Bu iki methodu ekleme sebebim hareketEt() ve dur() methodlarını biraz daha zenginleştirmektir. Bu sayede hem method içerisinden method çağrımı yapmayı, hem de this anahtar sözcüğü ile methodları bir arada kullanmayı gözlemleyeceğiz.

Hatırlarsanız this sözcüğünü daha evvel  “Bu sınıfın içerisindeki” anlamıyla bağdaştırmıştık. Hareket ettireceğimiz kara aracında gaza basmamız, durduracağımız kara aracında ise frene basmamız gerekir. O halde bu methodları birbirleriyle ilişkilendirmemiz gerekiyor. Şu şekilde bir yaklaşım sergileyebiliriz; hareketten (Hareket başladı) evvel gaza basılmalı ve durma eyleminden (Hareket bitirildi) önce fren yapılmalıdır. O halde ben hareketEt() methodunu tetiklediğimde ekrana önce “Gaz verildi” yazmalı ve sonrasında “Hareket başladı” yazmalıdır. dur() methodu için de benzer bir yaklaşımı kullanabiliriz. Bu iki methodumu da aşağıdaki gibi düzenliyoruz.

	public void hareketEt() {
		this.gaz();
		System.out.println("Hareket başladı");
	}

	public void dur() {
		this.fren();
		System.out.println("Hareket bitirildi");
	}

Bütün methodlarımız KaraAraclari sınıfımızn içerisinde olduğundan, diğer methodları çağırırken yine this anahtar sözcüğüne başvururuz. Burada da bunun bir örneğini görmüş olduk. TestClass sınıfımızı bu şekilde çalıştırdığımızda oluşacak çıktıya gelin birlikte bakalım.

Sınıflar ve methodlar ile ilgili olarak şimdilik bu noktada bitirebiliriz. Bir sonraki yazımız sınıf yapılarının nispeten devamı olacak nitelikte bir yazı olacak. Ancak javadaki bir diğer temel kavram ile ilgili olacağından ayrı bir yazı olarak yayınlamaya karar verdim. Bir sonraki yazımızda görüşmek üzere.

Sınıf Yapıları – II

Bir önceki yazımızda sınıf yapılarına giriş yapmıştık. Sınıfların genel özelliklerinden bahsetmiştik ve sınıfların fieldlar ve methodlardan oluştuğunu söylemiştik. Bununla birlikte constructor (Yapıcı fonksiyonlar) ile nesne yaratmaya değinmiştik.

Bir Sınıfa Ait Bir Nesne Yaratmak

Constructor yani yapıcı fonksiyon ile ilgili bazı eklemeler ile konuya devam edelim. Söz dizimi ile ilgili yazımızda methodların yanında bulunan parantezlerin, methoda yollanmak istenen parametrelerin eklendiği/sıralandığı yer olduğunu söylemiştik. Constructor çağrısını yaptığımız satırı tekrar hatırlayalım.

KaraAraclari otomobil = new KaraAraclari();

Eşittir operatörünün sağ tarafında gördüğünüz ifade, new sözcüğü sebebiyle, özel bir method çağrısıdır. Ancak KaraAraclari sınıfımızda yine ismi/imzası KaraAraclari() olan bir method tanımlamadık. Peki bu olmayan methodu nasıl çağırdık.

Constructor kavramı javada özelleşmiş kavramlardandır. Constructor barındırmayan bir sınıf olmaz. Eğer bir constructor tanımlamıyorsanız java sizin yerinize bir tane tanımlayacaktır. Buna default constructor ismi verilir. Peki java bize bir default constructor veriyorsa neden farklı bir tane tanımlayalım ki?

Bu sorunun birden fazla cevabı bulunmakta. Örneğin size şöyle bir istek geldi diyelim:

  • Yeni bir kara aracı yaratıldığında bununla ilgili bir bildirimi ekrana yazdırmalıyız.

Bu sorunu yeni bir kara aracı yarattığımız her yerde bir ekrana bildirim yazdıran bir satırla yapmak mümkün. Ancak bu durumun 1 milyon defa tekrar ettiğini ve bir gün bu bildirimin artık kapatılması gerektiğini düşünün. Böyle bir senaryoda 1 milyon ayrı kod satırının silinmesi büyük bir iş olacaktır. Peki bu durumu nasıl çözebilirdik?

Her nesne yarattığımız yerde bildirim üreten kodu yazmak yerine, nesnenin yaratılma anında bunu yaparsak daha doğru olacaktır. Yani constructor içerisinde! Böylece, bir gün bu bildirim kapatılacaksa bu durumda 1 milyon satır kod değiştireceğimize, 1 satırı değiştirmemiz yeterli olacaktır. Peki ama default constructor bizim yerimize java tarafından tanımlanıyordu. Bunu nasıl düzenleyebiliriz? Bunun cevabı da basit: Default constructor tanımını kodunuza ekleyerek. Gelin bunu kodda görelim.

public class KaraAraclari {

	public int koltukSayisi;
	
	public KaraAraclari() {
		
	}

	public void hareketEt() {
		System.out.println("Hareket başladı");
	}

	public void dur() {
		System.out.println("Hareket bitirildi");
	}

	public void yonVer() {
		System.out.println("Yön verildi");
	}

}

Burada “public KaraAraclari()” ile verilmiş blok java tarafından tanımlanan default constructor fonksiyonunun kendisidir. Bu fonksiyonu sınıfın içerisine aldığımız için artık üzerinde değişiklikler yapabiliriz. Örneğin ekrana yeni bir araç yaratıldığını yazdıralım.

	public KaraAraclari() {
		System.out.println("Yeni bir araç yaratıldı");
	}

Eğer TestClass sınıfınızdaki main methodunu çalıştırırsanız aşağıdaki gibi bir çıktı elde edersiniz.

Şimdi de farklı bir ihtiyaçtan bahsedelim. Yeni bir kara aracı yaratıldığında, bu aracın koltuk sayısı “4” olarak ayarlansın. Bunun için constructor üzerinde minik bir değişiklik yapmamız gerekecek. Aşağıdaki gibi kodumuzu düzenliyorum.

	public KaraAraclari() {
		//System.out.println("Yeni bir araç yaratıldı");
		this.koltukSayisi = 4;
	}

Burada yeni bir ifade ile karşılaşıyoruz: “this“. Bu yeni ifadenin anlamı “Bu sınıfın içerisindeki” olarak ifade edilebilir. Dolayısıyla this.koltukSayisi, bu sınıftaki koltuk sayısı anlamına gelmektedir. TestClass ile bu durumu test etmek istersek aşağıdaki gibi bir kod parçası ile bunu gerçekleştirebiliriz.

Buradaki ifadeye dikkat ederseniz, ekrana değeri yazdıran fonksiyonda this.koltukSayisi değil otomobil.koltukSayisi ifadesi kullanılmıştır. Çünkü TestClass sınıfı içerisinde kullanılacak olan this ifadesi yine TestClass sınıfına ait fieldları/methodları refere edecektir. Bir sınıfa ait fielda, o sınıfın dışından erişirken değişken adını kullanırız. Buradaki örnekte değişkenimizin adı otomobil olduğundan ifade de buna göre yazılmıştır.

Alternatif Nesne Yaratma Yöntemi

Bildiğiniz gibi bisiklet de otomobil de kara aracıdır. Ancak bunların birisi tek, diğeri ise dört koltukludur. Bu durumda az önce yaptığımız örnek yanlış bir şekilde çalışmaktadır. Bu durumu düzeltmek için yapıcı fonksiyonumuzu parametrik bir hale getirmeliyiz. Bunun için constructor üzerinde bir değişiklik yapacağız. Aşağıdaki düzenlemeyi gerçekleştiriyoruz:

	public KaraAraclari(int kacKoltuk) {
		this.koltukSayisi = kacKoltuk;
	}

Bu değişikliği yaptığınızda TestClass sınıfınız hata verecektir. Ancak telaşa mahal yok, bunu düzelteceğiz. Öncelikle burada ne yaptığımızı anlatalım. Kavramsal olarak bazı ifadelerin sizde de oluşması için, bu durumları jargona uygun şekilde ifade etmek istiyorum.

  • Method imzasını değiştirdik: Method imzası, bir methodun içeriği olmadan onun erişim düzenleyicisini, geriye döndürdüğü değerin tipini, methodun adını ve methoda gönderilen parametreleri, bu parametrelerin tipini gösteren ifadedir. Methoddaki ana/dış bloğu kaldırdığımızda geriye imzası kalmaktadır. Bu değişiklikle daha evvel parametre almayan bir methoda (constructor) parametre (int kacKoltuk) göndermeye başladık. Dolayısı ile method imzasını değiştirdik ifadesini kullanabiliriz.
  • Methoda parametre geçtik: Bir üst maddede belirttiğim gibi daha evvel parametresiz çalışan bir methoda sayısal bir değeri parametre olarak gönderdik. Parametreler parantez içindeki ifadelerdir. İmzaya parametre eklenirken yani methoda parametre geçilirken, önce parametrenin tipi sonra da method bloğu (scope) boyunca geçerli olacak olan parametre ismi eklenir.

Peki neden TestClass sınıfımız hata verdi? Yeri gelmişken editörümüzün kullanımına da bakalım. TestClass sınıfımıza gidelim. Altı kırmızı ile çizili ifadeye imlecimizi getirdiğimizde aşağıdaki gibi bir görüntüyle karşılaşacaksınız.

Burada editörün bize şunu söylediğini görüyoruz: “Parametre almayan, yani KaraAraclari() imzasına sahip, bir constructor bulunmamaktadır.”

İyi, ancak bu imza default constructora ait ve bunu java bize vermeliydi. Bu durum ancak başka bir constructor tanımı yapılmadıysa geçerlidir. Biz constructorımızın imzasını değiştirip ona parametre eklemiştik. Bu durumda java default constructor için sergilediği davranışını sergilemez ve onu yok eder. Peki bu kötü bir şey değil midir? Cevap ise hayır olacaktır. Bu iyi bir şeydir. Java sizin kurallara bağlı kalmanızı ister. Kural “1 parametre ile nesne yaratabilirsin” ise iki parametre ile ya da hiç parametresiz obje yaratma işlemi gerçekleşmez. Ancak size güzel bir haberim var. Java aynı zamanda yeni bir kural eklemenize izin verir. Gelin şimdi bu durumu yakından inceleyelim.

Kara araçlarını temsil ettiğimiz sınıfımıza yeni bir field daha ekleyerek bu işe başlayalım. Yine etrafımızdaki araçları düşünürsek hepsinin özelliği olarak bir renge sahip olmaları aklımıza gelecektir. O halde sınıfımıza bu özelliği ekleyelim. Tahmin edeceğiniz üzere renk özelliği sayısal bir değerle ifade edilmeyip; metin değer taşıyan bir özelliktir. O halde tipi String olacaktır. Sınıfımızı aşağıdaki gibi güncelliyoruz.

public class KaraAraclari {

	public int koltukSayisi;
	
	public String renk;
	
	public KaraAraclari(int kacKoltuk) {
		this.koltukSayisi = kacKoltuk;
	}

	public void hareketEt() {
		System.out.println("Hareket başladı");
	}

	public void dur() {
		System.out.println("Hareket bitirildi");
	}

	public void yonVer() {
		System.out.println("Yön verildi");
	}

}

Bu durumda ise mevcut constructor ile rengi olan bir araç yaratamıyoruz. Oysa ki constructor fonksiyonumuz iki parametre alsaydı bu duruma düşmeyecektik. Bu şekilde tasarlanmış bir constructor için kod şuna benzerdi:

public KaraAraclari(int koltukSayisi, String renk) {
    this.koltukSayisi = koltukSayisi;
    this.renk = renk;
}

Burada işleri biraz daha karıştırmak istedim. Öncelikle imzaya bakalım. Constructor imzasında, parametre sayısında bir değişiklik olmuş. Parametre kısmı bize şunu söylüyor: “Bu constructor 2 parametre ile çağırılabilir. Bunlardan ilk olan değer sayısaldır ve koltukSayisi ismindedir. İkinci sıradaki parametre ise metin bir değerdir ve ismi renk olacaktır.”

Buraya kadar her şey güzel. Ancak koltukSayisi ve renk isimleri sınıfımızın içerisinde ayrıca bir field idi. Bu ikisini (field ve parametre) birbirinden nasıl ayırt edeceğiz? Buradaki anahtar this sözcüğüdür. Constructor içerisine bakarsanız this.koltukSayisi = koltukSayisi ifadesini görürsünüz. Bunun anlamı “Sınıf içerisindeki koltukSayisi isimli fielda constructora parametre olarak gelen koltukSayisi değerini ata” olacaktır. Aynı durum renk için de geçerlidir.

Bu iki constructordan birini koda eklediğimizde parametresiz, yani default, constructor kaybolacak. Ancak bizim buradaki yaklaşımımız bu üçünden de aynı anda faydalanabilmekti. Güzel haber ise hiçbirinden vazgeçmeden üçüne birden sahip olabileceğimizdir. Hiç çekinmeden bu üç constructor fonksiyonumuzu kodumuza ekliyoruz ve kodumuzu finalize ediyoruz. Ben ayrıca her constructor içerisine bir de ekrana yazı yazan bir kod ekleyeceğim ki örnekler kafanızda daha net otursun.

public class KaraAraclari {

	public int koltukSayisi;
	
	public String renk;
	
	public KaraAraclari() {
		System.out.println("Yeni bir araç yaratıldı (Parametresiz)");
	}
	
	public KaraAraclari(int kacKoltuk) {
		System.out.println("Yeni bir araç yaratıldı (1 parametreli)");
		this.koltukSayisi = kacKoltuk;
	}
	
	public KaraAraclari(int koltukSayisi, String renk) {
		System.out.println("Yeni bir araç yaratıldı (2 parametreli)");
		this.koltukSayisi = koltukSayisi;
		this.renk = renk;
	}

	public void hareketEt() {
		System.out.println("Hareket başladı");
	}

	public void dur() {
		System.out.println("Hareket bitirildi");
	}

	public void yonVer() {
		System.out.println("Yön verildi");
	}

}

Parametresiz constructor da eklendiği için TestClass sınıfımızdaki hata da ortadan kaybolmuş olacak. Şimdi bunlarla bir test yapalım. TestClass sınıfımızı aşağıdaki gibi düzenliyoruz.

public class TestClass {

	public static void main(String[] args) {
		
		KaraAraclari birinciArac = new KaraAraclari();

		KaraAraclari ikinciArac = new KaraAraclari(1);
		
		KaraAraclari ucuncuArac = new KaraAraclari(2, "Kırmızı");
	}
}

Gördüğümüz üzere çıktıya bakarak 3 ayrı constructor fonksiyonunun da çalıştığını gözlemleyebiliyoruz. Ana konudan bağımsız olarak dikkatinizi bir noktaya daha çekmek istiyorum. Gönderdiğimiz parametrelerde sayısal değerleri doğrudan yazarken, metin ifadeleri çift tırnak içerisine aldık. Bu da bir söz dizim kuralı gereğidir. Eğer “Kırmızı” yerine Kırmızı yazsaydık editör bize kızacak ve programımız çalışmayacaktı.

Bu yazımızı da burada sonlandırıyoruz. Bir sonraki yazımız tekrar sınıflar üzerine olacak. Konuları giderek derinleştireceğiz ve javanın temellerinde yatan kavramları tek tek işleyeceğiz. Her zamanki gibi bol tekrar öneriyorum.

Sınıf Yapıları – I

Java öğrenmeye karar verdiyseniz karşınıza mutlaka sınıf, class, nesne gibi kavramlar çıkacaktır. Bu yazıda tam olarak bu kavramları ele alacağız.

Java nesneye yönelik bir programlama (OOP) dilidir. Bunu gerçek hayata bakarak yorumlayabiliriz. Gerçek hayatta motorlu taşıt kavramını düşünürsek;

  • Bu taşıtın bazı özellikleri (attribute) vardır. Bunlar ağırlık, yapabileceği en yüksek hız, renk gibi özellikler olabilir
  • Bu taşıtın ileri gitme, durma gibi bazı fonksiyonları (method) vardır
  • “Motorlu taşıt” çerçeve kavramdır (interface) ve buna uygun araçlar vardır. Otomobil, gemi, traktör gibi araçlar birer motorlu taşıttır
  • Volvo markası tüm araçlarına standart olarak bazı donanımları ekleyebilir. (Inheritance)
  • BMW 320 ve Massey Ferguson 240 birer motorlu taşıt olup birisi otomobil çerçevesinde(class-sınıf) diğeri ise traktör çerçevesinde özellikler taşıdığından hem benzerlerdir hem de ayrışırlar
  • Bazı motorlu taşıt markalarının parçalarını sadece yetkili servisler söküp takabilir (Encapsulation)
  • Bazı araçlar sadece insan taşımaya uygunken, bazı araçlar yükün ne olduğuna bakmaksızın (abstraction) istenileni taşır.

Yukarıda saydığım özellikleri javanın programlama pratiklerinde de görürüz. Özellikle parantez içerisinde verdiğim anahtar kelimeler size internette arama yapabilmek için yol gösterici olacaktır.

Bir Sınıfı Tanımlamak

Pekala, bir sınıf/class nasıl tanımlanır? Kod tekrarına düşmemek adına burada tekrar merhaba dünya örneğini kullanmayacağım. Bunun yerine gelin yukarıdaki motorlu taşıt örneğinden faydalanalım.

Bildiğiniz gibi bir sınıf tanımlamak için bir sınıf bloğu yaratmamız gerekiyor. Bloklar süslü parantezle başlayan ve biten yapılardır. Yani { ve } işaretlerinin arasında kalan bir yapı kuracağız.

Yine önceki yazılardan hatırlayacağınız üzere bir sınıfı tanımlarken ona bir isim vermemiz gerekiyor. Javada kültür olarak sınıf isimleri büyük harfle başlar ve isimlendirme için PascalCase yöntemi izlenir. Ben bu sınıfa KaraAraclari diyeceğim. Türkçe karakter kullanmamaya özen göstermeniz ve hatta isimlendirmeleri ingilizce yapmanız genel programlama kültürüne uygun olacaktır.

Bu sınıfı, sonraki yazılarda değineceğimiz public erişim düzenleyicisiyle yaratacağım. Bu herkes tarafından erişilebilir anlamına geliyor. Buraya çok takılmadan devam edebiliriz.

Son olarak KaraAraclari ismindeki sınıfımızın, nasıl sınıf olarak belirtileceğine değinelim. Yine sözdizim ile ilgili yazıda bahsettiğimiz gibi sınıflar class sözcüğü ile nitelendirilir. Şimdi elimizdeki bilgilerle KaraAraclari sınıfımızı yaratalım.

Öncelikle merhaba dünya yazısında anlattığım gibi yeni bir proje yaratalım. Projemizin ismini 01 – ClassExamples olarak belirleyelim. Proje isimlendirmesini bu şekilde yapmamın bir sebebi var. Editörü açtığınızda projelerinizin belirli bir sırada görünmesi öğrenme ve hatırlama açısından size yardımcı olacaktır.

Projemizi oluşturduktan sonra, proje içerisindeki src klasörüne sağ tıklıyoruz ve yeni bir sınıf oluşturuyoruz. Bunun da örneğini merhaba dünya projesinde yapmıştık. Yeni sınıfımıza
KaraAraclari ismini veriyoruz. Merhaba dünya sınıfından farklı olarak main methodu oluşturmayacağız. Dolayısıyla bu seçeneği seçmemeniz gerekiyor.

Bu noktada finish butonuna tıkladığınızda yeni sınıfı yaratmış olacaksınız. Karşınızda şöyle bir sınıf görmeniz gerekiyor.

public class KaraAraclari {

}

Şimdi yazının girişinde değindiğimiz maddeleri bu sınıfın içeriğine ekleyelim. Temel olarak sınıfları 2 ayrı parçadan oluşuyormuş gibi düşünebiliriz.

  • Özellikler (field, attribute)
  • Fonksiyonlar (method)

Öncelikle kara araçlarını düşünürsek bir çok araç aklımıza gelecektir. Bisiklet, buldozer, otomobil, traktör gibi örnekler bu tanıma uymakta. Bunları bir arada düşünürsek; hem özellik olarak, hem de fonksiyon olarak benzerlikler bulabiliriz. Bu araçların tamamında “hareket etme”, “yön verme”, “hareketi durdurma” gibi fonksiyonlar bulunur. Bunun dışında fonksiyon olarak sayamayacağımız, ancak özellik olarak niteleyebileceğimiz, ortak noktalar da bulunur. Bisiklet, buldozer ve traktör için tek kişilik oturma yeri bulunurken otomobil için 4 kişilik yer bulunur. Aralarında fark varmış gibi gözükse de, “oturma yeri” kavramı hepsinde ortaktır. O halde bu detayları, kodladığımız sınıfımıza ekleyelim.

public class KaraAraclari {

	public int koltukSayisi;

	public void hareketEt() {
		System.out.println("Hareket başladı");
	}

	public void dur() {
		System.out.println("Hareket bitirildi");
	}

	public void yonVer() {
		System.out.println("Yön verildi");
	}
}

Yukarıda paylaştığım sınıf 1 adet field ve 3 adet method ile oluşturulmuş bir sınıftır. Bunların detayına biraz değinirsek;

  • Tüm tanımlamalar public anahtar sözcüğü ile başlamaktadır. Bu da uygulamanın her yerinden bu sınıfa ve içeriğine ulaşılabileceği anlamına gelmektedir.
  • Methodlarımız public sözcüğünden sonra void ile devam etmektedir. Bu da geriye herhangi bir değer dönmedikleri anlamına gelir. Method bloklarının içlerine bakarsanız “return” ifadesini görmemekteyiz.
  • koltukSayisi isimli field, isminden de anlaşılacağı üzere sayısal bir değer taşımaktadır. buna uygun olarak “int” anahtar sözcüğü ile nitelendirilmiştir.

Bir Sınıfa Ait Bir Nesne Yaratmak

Bildiğiniz gibi java OOP (Object Oriented Programming) yapısı ile çalışacak şekilde tasarlanmış bir dildir. Bunu gerçek hayata benzetmek oldukça kolay. “Kara araçları” kavramını düşündüğümüzde günlük hayatta karşımıza bir çok örnek çıkar. İşte o aklınıza gelen her türlü araç, yazılım perspektifinden bir “nesne” olarak kabul edilir. Günlük hayatımızda karşımıza çıkan bu araçları javada siz yaratırsınız. Bu işi yapmanıza yarayan fonksiyonlara constructor ismi verilir.

Peki constructor nasıl kullanılır? Gelin bunu bir örnek ile inceleyelim. Az önce yarattığımız KaraAraclari sınıfına müdahale etmeden, farklı bir sınıf daha yaratalım. Bu sınıf test amaçları için yaratılmış olsun. src klasörüne sağ tıklayın ve yeni bir sınıf oluşturun. Sınıfımızın ismi TestClass olsun ve içeriğinde bir main barındırsın.

Şimdi bu sınıf içerisinde, KaraAraclari sınıfına ait bir nesne yaratalım. Bunun için “new” anahtar sözcüğünü, main methodu içerisinde kullanacağız.

public class TestClass {

	public static void main(String[] args) {
		
		KaraAraclari otomobil = new KaraAraclari();

	}
}

Buradaki main methodunun içerisinde gördüğünüz satırı yorumlayalım.

  • Javada bir nesne tanımı yapılırken öncelikle “tipi” belirtilir. Burada tanımlayacağımız nesnemizin tipi “KaraAraclari” olacağından ilk sözcük bu olmuştur.
  • Nesne tanımlarında tipten sonra, programın geri kalanında o nesnenin isminin ne olacağını belirtiriz. Buradaki “otomobil” sözcüğü bu nesnenin ismidir. İsimlendirme kuralları için değişkenler yazımıza göz atabilirsiniz.
  • Değişken isminden sonra eşittir, yani atama operatörü, yer alır. Bu operatör kendisinden sağda kalan değeri, kendisinin solundaki değere atar. Buraya kadar olan kısmı konuşma diliyle anlatırsak; “İsmi otomobil olan bir kara aracı yaratmak istiyorum ve değeri şudur: “
  • new anahtar sözcüğü constructor çağrısı yapacağımızın bir göstergesidir. Javada constructor çağrısı olmadan da yeni bir nesne yaratmak mümkündür. Bunu ilerleyen konularda ele alacağız. Ancak bizim buradaki amacımız constructor konusuna değinmek olduğundan bu detaya girmeyeceğiz.
  • new anahtar sözcüğünü tekrar KaraAraclari sözcüğünün takip ettiğini görüyoruz. Yine konuşma diline yakın bir ifadeyle düşünürsek, eşitliğin sağ tarafını “Yeni bir kara aracı yaratmak istiyorum” diye niteleyebiliriz.

Tüm bu noktaları birleştirdiğimizde karşımıza çıkan sonuç, ismi otomobil olan yeni bir değişken yaratmış olmamızdır ki bu değişkenin tipini de KaraAraclari olarak belirtmiş bulunuyoruz. İşte bu değişken, diğer isimleri ile nesne, object veya instance olarak da nitelenir.

Bu yazıyı burada noktalıyoruz. Sonraki yazımız yine sınıflar üzerine olacak.