10 Nisan 2013 Çarşamba

JAVA'DA SOYUT SINIF(ABSTRACT CLASS)

Kalıtım(inheritance) konusundan bildiğimiz üzere bir süper sınıf ve onun alt sınıflarında oluşur.Soyut sınıflar da bu aşamada işe yarıyor.Görevleri birleştiricilik yapmaktır yani alt sınıflar için süper sınıf olurlar.Soyut sınıfları  şimdiye kadar  oluşturduğumuz sınıflardan farklı yapan şey bu sınıfın eksik bir sınıf oluşu diyebiliriz.Ne demek bu? Normalde bir sınıf oluşturduğumuzda tüm fonksiyonların gövdesini(body) yazıyorduk.Ancak soyut sınıflarda en az bir metodunun gövdesi yazılmaz.Bu metotlara soyut metot denir ve bu metotlar alt sınıflar için ortak  kullanılan,işlevi aynı olan fakat döndürdükleri değer açısından farklılık gösteren fonksiyonlardır ve her  alt sınıfta override edilmek zorundadır.
Soyut sınıflarda  yapılandırıcılar(contructor),static metotlar soyut metot olamazlar ve bu sınıflardan nesne üretilemez.
Java'da soyut sınıf gösterimi abstract anahtar sözcüğü ile yabılmaktadır.extends kelimesiylede alt sınıfı super sınıfa bağlarız (inherit etmesini sağlarız).Kullanımı şu şekildedir:

public abstract class super_class_name //sınıf tanımlaması
{
         public abstract data_type method_name(); //soyut method tanımlaması
         //other function with body
}
 public class derived_class_name extends super_class_name //alt sınıf tanımlaması
{
   //override...
   //other functions
}


Şimdi de örnek bir uygulama yazalım.Oldukça basit bit  bir örnek.Şekill adında  super soyut sınıfımız var ve alt sınıfları kare ve dikdörtgendir(İstediğimiz kadar şekil ekleyebiliriz.).Alt sınıfların ortak yaptıkları işlev alan hesaplamadır.Bu nedenle alan metodumuzu soyut metot yapacağız.


//*************
//Şekill
//*************
package AbstractClass;

public abstract class Şekill {
	public abstract double alan(); 

}
//*************
//Kare
//*************
package AbstractClass;

public class Kare extends Şekill{
	private double kenar1;
	public Kare(double kenar1)
	{
		this.setKenar1(kenar1);
	}
	public double getKenar1() {
		return kenar1;
	}
	public void setKenar1(double kenar1) {
		this.kenar1 = kenar1;
	}
	public double alan()
	{
		return Math.pow(kenar1, 2);
	}

}
//*************
//Dikdörtgen
//*************
package AbstractClass;

public class Dikdörtgen extends Şekill{
	private double kenar1,kenar2;
	
	public Dikdörtgen(double kenar1,double kenar2)
	{
		this.kenar1=kenar1;
		this.kenar2=kenar2;
	}

	public double getKenar1() {
		return kenar1;
	}

	public void setKenar1(double kenar1) {
		this.kenar1 = kenar1;
	}

	public double getKenar2() {
		return kenar2;
	}

	public void setKenar2(double kenar2) {
		this.kenar2 = kenar2;
	}
	public double alan()
	{
		return kenar1*kenar2;
	}
}
//*************
//Mainn
//*************
package AbstractClass;

public class Mainn {

	/**
	 * @author Aylin COSKUN
	 */
	public static void main(String[] args) {
		Şekill sekil=new Kare(3);
		System.out.println("Karenin alanı : "+sekil.alan());
		
		Şekill sekil2=new Dikdörtgen(2, 7);
		System.out.println("Dikdörtgenin alanı : "+sekil2.alan());
		
		
		

	}

}

Main de ne yaptık peki? Şekil sınıfımızdan nesne oluşturamayız bu nedenle sekil adında instance yapıp buna Kare nesnesi atadık.Böylece artık sekill instance artık Kare gibi davranacaktır ve alan metodu çağrıldığında Kare'nin alanını hesaplayacaktır.Dikdörtgen için de aynı şeyleri yaptık...

Son olarakta program çıktımız...



4 yorum: