İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır

Class'lar (Sınıflar)

Class,Property ve Method Kavramları

Yazılım geliştirmenin iki temel bileşeni vardır : veri ve işlev. Her tür program belli veriler üzerinde belli işlever gerçekleştirir. Nesne, belli bir anlam bütünlüğü içeren veriler ve gerektiğinde o verilerle çalışan işlemlerden oluşan yapıdır. Dikdörgenler prizması diye bir nesne olduğunu düşünelim. Bununla ilgili en, boy ve yükseklik gibi veriler vardır. Ayrıca alanını ve hacmini hesaplama gibi işlemler bulunmaktadır. Java'da veri ve işlem içeren her birime "class" (sınıf) denir. Class'ların içerdiği veriye "property" (özellik), işlemlere de "method" (yöntem) denir. Dikdörtgenler prizması'nı belirten bir nesne yapalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class RectangularPrism{
  2   float width;
  3   float height;
  4   float depth;
  5   float getVolume(){
  6     return width*height*depth;
  7   }
  8   float getArea(){
  9     return 2*(width*height+width*depth+height*depth);
 10   }  
 11   
 12 }

Burada yaptığımız, dikdörtgenler prizması diye bir nesne olduğunu, bu nesnenin width, height, depth gibi özellikleri olduğunu, bu nesneyle alan ve hacim hesaplaması yapabileceğimizi söylemekten ibarettir. Ayrıca her property'nin veri tipini de belirttik. Dikdörgenler prizmasının kenarların kesirli sayılarla belirtilebilir.

Instance

Yukarıda bir class'ı tanımladık ('definition' yaptık). Bu class bütün dikdörtgenler prizmalarında olabilecek özellikler ('property'ler) ve yöntemler ('method'lar) içeriyor. Henüz ortada belli bir prizma yok. Belli bir pizmanın "yaratılması" gerekli ki biz hacmini ve alanını bulalım. Class tanımına uygun olarak yaratılan nesnelere instance (örnek) denir. Dikdörtgenler prizmasına bir örnek verilmesi, başka bir deyişle bir dikdörtgenler prizması yaratılması lazım. Buna nesneye yönelik programlamadaki terminolojiyi kullanırsak, RectangularPrism class'ından bir instance yaratılması gerekiyor. Bir prizma yaratalım, boyutlarını 10,20 ve 30 olarak verelim. Alanını ve hacmini hesaplayıp ekrana yazalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class RectangularPrismTest{
  2   public static void main(String[] args){
  3     RectangularPrism prism=new RectangularPrism();
  4     prism.width=10.0f;
  5     prism.height=20.0f;    
  6     prism.depth=30.0f;        
  7     float volume=prism.getVolume();
  8     System.out.println("Volume : "+volume);
  9     float area=prism.getArea();
 10     System.out.println("Area : "+area);
 11   }
 12 }

Burada RectangularPrism class'ından bir instance yarattık. İsmi de 'prism'. Bu isim rastgele seçilmiş bir isimdir, kısaca 'p' de diyebilirdik. Ancak bir kez prism dedikten sonra aşağıda aynı ismi kullanmak zorundayız.

Property Intialization

Bir nesne yaratılırken 'property'lerinin değerleri default (varsayılan) değerlerine atanır. Property'ler de birer nesneyse (primitive type değilse) 'null' değerini alır. Bir değer olarak 'null' hiç bir değeri yok demektir. Bir nesneyi yaratıp kullanan kişi bir method'u çağırmak için gerekli olan property'lerin değerlerini önceden vermezse hata durumu oluşur. Örneğin, prism değerinin 'height' property'si verilmezse hacim hesaplanmaya çalışılırsa ne olacak? Nasıl bir hacim değeri üretilecek? Böyle sorunlarla karşılaşmamak için property'lerin 'initialize' edilmesi gerekebilir. Property'ler belirlenirken

	float width=1.0f;	
	float height=1.0f;	
	float depth=1.0f;		

şeklinde bir initialization yapılabilir. Böylelikle bir değerin verilmesi unutulsa bile belli bir değer default alınacağından sorun çıkmaz. Height değeri verilmezse hacim 1 çıkar. Alan da 2*(1*1+1*1+1*1)=6 çıkar.

Constructor

Bir nesnenin yaratılma aşamasında bazı işlemlerin yapılması, bazı değerlerin atanması gerekebilir. Bir nesne yaratılırken çağrılan method benzeri yapıya 'constructor' denir. Constructor aslında bir method değildir. Ama class'la aynı ismi taşıyan, dönüş değeri olmayan bir method olarak da düşünülebilir. Prizmanın boyutlarının daha instance yaratılırken verilmesi bu şekilde sağlanabilir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class PrismWithConstructor{
  2   float width;
  3   float height;
  4   float depth;
  5   public PrismWithConstructor(float w,float h,float d){
  6     width=w;
  7     height=h;
  8     depth=d;  
  9   }
 10   float getVolume(){
 11     return width*height*depth;
 12   }
 13   float getArea(){
 14     return 2*(width*height+width*depth+height*depth);
 15   }  
 16   
 17 }

Bu class'ı kullanan bir application yapalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class PrismWithConstructorTest{
  2   public static void main(String[] args){
  3     PrismWithConstructor prism=new PrismWithConstructor(10.0f,20.0f,30.0f);
  4     float volume=prism.getVolume();
  5     System.out.println("Volume : "+volume);
  6   }
  7 }

Method Signature

Bir method'un ismiyle birlikte sırasıyla aldığı parametre tipleri, o method'un 'signature'unu oluşturur. Siz bir method çağırdığınızda, öncelikle o nesnede o isimde bir method olup olmadığına bakılır. Eğer varsa, çağırdığınız parametreler'in tipleriyle birlikte eşleştirme yapılır ve uygun bir method varsa derleme işlemi başarılı olur. Aksi takdirde kod derlenemez.

Bir nesnenin bir methodunu çağırdığınızda compiler kızıyorsa ve siz method ismini doğru yazdığınıza eminseniz, bilinki verdiğiniz paramtereler ya eksiktir, ya fazladır, ya sırası yanlıştır ya da parametre tipleri yanlıştır.

Overloading (Çeşitleme)

Bir method'la aynı isimde başka bir method yazılabilir. Buna overloading (çeşitleme) denir. Bu işlem, benzer işlemleri farklı parameteler'le yapan iki method için yapılır. Bu şekilde, bir çok method ismini öğrenmekten kurtulmuş oluruz. Ancak, overloading işleminde yeni method'un signature'u mutlaka farklı olmalıdır ki bir method çağırdığınıza hangisini çağırdığınız anlaşılabilsin. Zaten aynı isimde aynı parametreleri aynı sırada alan bir ikinci method yazmanın hiç bir anlamı yoktur. Aynı işi yapıyorlarsa, bir tanesine hiç gerek yok. Farklı işler yapıyorlarsa farklı bir isimde olmalıdır.

Bir method'un return type'ı signature'a dahil değildir. Yani aynı isimde aynı parametre tiplerini aynı sırada belirten fakat iki ayrı return type olan iki ayrı method olamaz. Java'da bir method'un döndürdüğü değerin fazla bir önemi yoktur. Sadece o method'u çağıran için gerekliyse bir anlamı vardır. Hatta bir değer döndüren method, döndürdüğü değer kullanılmadan da çağrıabilir. Bazı method'lar belki lazım olur diye belli bir değeri döndürmektedirler.

Birden Fazla Constructor

Bir class'ın farklı parametreler alan birden fazla constructor'u olabilir. Yani constrcutor'lar da method'lar gibi 'overload' edilebilirler.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class PrismWithMultipleConstructor{
  2   float width;
  3   float height;
  4   float depth;
  5   public PrismWithMultipleConstructor(float w,float h){
  6     width=w;
  7     height=h;
  8     depth=1.0f;  
  9   }
 10   public PrismWithMultipleConstructor(float w,float h,float d){
 11     width=w;
 12     height=h;
 13     depth=d;  
 14   }
 15   float getVolume(){
 16     return width*height*depth;
 17   }
 18   
 19 }

Bir constructor başka bir constructor'u çağırabilir. Bunun için 'this' operatörü kullanılmalıdır.

	public PrismWithMultipleConstructor(float w,float h){
		this(w,h,1.0f);
	}
	public PrismWithMultipleConstructor(float w,float h,float d){
		width=w;
		height=h;
		depth=d;	
	}

Burada iki constrcutor'dan biri diğerini çağırıyor. Kendisine gelen değerleri aynen öbürüne devrederken bir değeri kendisi belirliyor. Bu yöntemin yararı, bir değişiklik yapıldığında sadece tek bir constructor'un değiştirilmesinin yeterli olmasıdır.

Default & Parameter'siz Constructor'lar

Aslında, programcı hiç bir tane yazmasa dahi, her class'ın bir constructor'u vardır. Sanki

public class MyClass{
	public MyClass(){
	}
}

şeklinde bir constructor verilmiş gibi kabul edilir. Programcı hiç bir şey yapmadığında sağlanan default constructor hiç parametre almaz ve hiç bir işlem yapmaz. Hiç parametre almayan ama bazı initilization işlemleri yapan contructor'lar da yazılabilir. O zaman parameterless constructor (parametresiz kurucu) olur. Birim küpü 2, 2, 2 boyutlarında kabul ettiğimizi varsayalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class PrismWithParameterlesConstructor{
  2   float width;
  3   float height;
  4   float depth;
  5   public PrismWithParameterlesConstructor(){
  6     width=2.0f;
  7     height=2.0f;
  8     depth=2.0f;  
  9   }
 10   public PrismWithParameterlesConstructor(float w,float h,float d){
 11     width=w;
 12     height=h;
 13     depth=d;  
 14   }
 15   float getVolume(){
 16     return width*height*depth;
 17   }
 18   float getArea(){
 19     return 2*(width*height+width*depth+height*depth);
 20   }  
 21   
 22 }

Görüldüğü gibi class'ın iki constructor'u var. Birisi parametreleri dışardan alıyor, diğeri içerde belirliyor. İki constructor'u da test edelim. Birisi default contructor'la birim küp yaratsın, diğeri boyutları vererek.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class PrismWithParameterlesConstructorTest{
  2   public static void main(String[] args){
  3     PrismWithParameterlesConstructor prism1=
  4       new PrismWithParameterlesConstructor();
  5     PrismWithParameterlesConstructor prism2=
  6       new PrismWithParameterlesConstructor(10.0f,20.0f,30.0f);
  7     float volume1=prism1.getVolume();
  8     float volume2=prism2.getVolume();
  9     System.out.println("Volume 1: "+volume1);
 10     System.out.println("Volume 2: "+volume2);
 11   }
 12 }                          ,

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır