Soyut(Abstract) Sınıflar

Soyut sınıflar, tüm alt sınıfları tarafından paylaşılacak metodların tanımlarını içeren sınıflardır. Soyut sınıflar içeriği belirlenmemiş sadece etiketi(C’deki prototip belirtimi gibi) belli bir ya da daha fazla soyut metod içerirler. Bu metodların içeriklerine alt sınıflarda bindirme (override) yapılarak içerik kazandırılır. Bir soyut sınıftan türeyen tüm alt sınıflarda bu soyut metodlara bindirme yapılmalıdır. Bir soyut sınıf tamamlanmamış olduğu için nesne haline getirilemez. Mutlaka “extends” anahtar sözcüğü ile yeni sınıflara miras bırakarak kullanılmalıdır. Kısaca bir sınıf isminden önce “abstract” kelimesi vars o sınıf soyuttur ve ve en az bir adet “abstract” tanımlı metod içermelidir.

Aşağıdaki örneklerde sekil soyut sınıfından önce noktaX türetilmiş ve soyut metod olan isimoku()’nun içeriği noktaX’de tanımlanmıştır. noktaX’den daireX’e, daireX’ten de silindirX’e miras kalan isimoku()’nun içeriği hepsinde farklıdır. Demo programında bu üç farklı sınıftan türeyen üç farklı nesne, soyut sınıf tipinde oluşturumuş diziye atanabilmiştir. Kısaca üç farklı nesne tek çatı altında toplanmıştır. Hepsi de isimoku(),alan() ve hacim() metodlarına cevap verebilmiştir. Diğer bir örnekle bir bisiklet, bir otomobil ve bir tır aynı garajda toplanmış ve üçüne de “kornaya bas” emri verildiğinde kendi tarzlarında aynı anda kornayı çalmışlardır.

sekil.javanoktaX.java
public abstract class sekil  {   public double alan() {return 0.0;}   public double hacim() {return 0.0;}   public abstract String isimoku();}public class noktaX extends sekil {    protected double x,y;    public noktaX(double a,double b) {     x = a; y = b;          }    public String isimoku() {return “Nokta”;} }
daireX.javasilindirX.java
public class daireX extends noktaX{    protected double yaricap;    public daireX(double a, double b, double r) {    super(a,b);    yaricap=r;    }    public String isimoku(){ return “Daire”;}    public double alan() {return Math.PI*Math.pow(yaricap,2);}}public class silindirX extends daireX{    protected double yukseklik;    public silindirX(double a, double b, double r, double h) {    super(a,b,r);    yukseklik=h;    }    public String isimoku(){ return “Silindir”;}    public double alan() {return 2*super.alan() + yukseklik * 2*Math.PI*yaricap;}    public double hacim() {return super.alan() * yukseklik;}}
soyutdemo.javaÇıktı
class soyutdemo {   public static void main(String args[]) {  sekil sekiller[]=new sekil[3];  noktaX n;  daireX d;  silindirX s;  n=new noktaX(2.0, 1.0);  d=new daireX(3.0, 4.0, 10.0);  s=new silindirX(2.0, 4.0, 3.0, 4.0);  sekiller[0]=n;  sekiller[1]=d;  sekiller[2]=s;  int i;  for(i=0;i<sekiller.length;i++) {  System.out.println(“Nesne….: ” + sekiller[i].isimoku()+ ”    “+sekiller[i].alan() + ”    ” +sekiller[i].hacim());  }   }  }C:\java\prog\java soyutdemoNesne….: Nokta   0.0   0.0Nesne….: Daire   314.15   0.0Nesne….: Silindir   131.95   113.09