Başka nitelemeler

Erişim belirtkelerinden farklı olan üç önemli belirtke daha vardır. Bunlar static, final ve abstract nitelemeleridir.

static

Bir sınıfa ait anlık değişken tanımlandığında, o sınıfa ait her bir nesne içinde söz konusu değişkenin bir kopyası oluşur. Dolayısıyla, farklı nesnelerde o değişkene farklı değerler atanabilir. Aynı anda, o değişkenin yaratılan nesne sayısı kadar farklı değeri olabilir.

Benzer olarak, bir sınıf içinde tanımlanan bir metodun bir kopyası her nesne içinde oluşur. Metotlar override edilerek, her nesnede onlara farklı işler yaptırılabilir. 

Ancak, bazı durumlarda değişkenlerin veya metotların, onların sınıfına ait olarak yaratılacak nesnelerden bağımsız ve biricik olmalarını, farklı nesnelerde farklı işlevlere sahip kopyalarının yaratılmamasını isteriz. Bunun için static belirtkesini kullanırız.

static damgalı değişkenlere ana bellekte ancak birer tane yer ayrılır, her nesne için ayrı yer ayrılmaz. Bunun yerine, onu kullanacak her nesne, ona ayrılan tek adrese ulaşır. Böylece, o sınıfa ait bir çok nesne yaratılsa bile, static değişkenin değerini ortak olarak kullanırlar. Tabii, program koşarken static değişkenin değeri değişebilir. Ama, değişene dek, bütün nesneler aynı değeri kullanmak durumundadır. Değeri değişse bile, o andan sonra gene bütün nesneler onun yeni değerini kullanır.

Benzer olarak, static belirtkesi ile damgalanan metot ancak bir kez tanımlanır. Alt-sınıflarda, aynı adlı başka metot tanımlanamaz. Overload veya overridden edilemez. Örneğin, main() metodu böyledir. Eğer birden çok main() metodu tanımlanabilseydi, işletim sistemi hangisini (önce) çağıracağını bilemezdi.

·         static nitelemesi metotlara ve değişkenlere verilebilir; sınıflara verilemez.

·         static damgalı metot ancak static damgalı verilere (değişken, sabit) erişebilir.

·         static damgalı metot, ancak static damgalı metotları çağırabilir.

·         this  ve super  anahtar sözcüklerini kullanamazlar.

Örnek: 

static  int  m= 5;

static double b ;

 

static void renkSec (Color color) {
   ....
}

 

Alıştırmalar

 

1. Aşağıdaki programı çözümleyiniz.

 

// static değişkenler, metotlar, and bloklar.

class DeneStatic {

  static int a = 5;

  static int b;

 

  static void deneme(int x) {

    System.out.println("x = " + x);

    System.out.println("a = " + a);

    System.out.println("b = " + b);

  }

 

  static {

    System.out.println("Static blok başlatıldı.");

    b = a * 3;

  }

 

  public static void main(String args[]) {

    deneme(37);

  }

}

 

1. Aşağıdaki programı çözümleyiniz.

 class StaticDemo {

  static int a = 26;

  static int b = 64;

  static void yaz() {

    System.out.println("a = " + a);

  }

}

 

class StaticYaz {

  public static void main(String args[]) {

    StaticDemo.yaz();

    System.out.println("b = " + StaticDemo.b);

  }

}

 

final

Bu belirtke nitelediği öğenin sabit kılındığını ve değiştirilemeyeceğini belirtir. Eğer final belirtkesi class öğeleri için kullanılırsa, o class’ın alt-sınıfları yaratılamaz. Metoda uygulanan final belirtkesi o metodun overridden yapılamayacağını söyler. Değişkene uygulandığında ise, o değişkeni bir sabit (constant) yapar. Final damgalı değişkenleri büyük harflerle yazmak Java’nın bir geleneğidir. Böylece, kaynak programa bakan kişi, onun bir sabit değer olduğunu anlar.

Örnekler:

final int ILK_DEGER = 1;

final float KATSAYI = 9.8;

 

class DeneSin {

   // bu değişkenin değeri değişemez
   final int sayac = 21;

   // bu metot override edilemez
   final int deneMetot(int a, int b) {
   }
}

 

abstract

absract belirtkesi soyut class ve/veya soyut metot yaratır. Soyut metotların adı, değişkenleri ve değer-tipi (return type)  belirtilir, ama metot gövdesi yazılamaz. Abstract class en az bir tane abstract metoda sahip olmalıdır. Abstract class’tan nesne yaratılamaz (instantiate); çünkü içerdiği abstract metod çalıştırılamaz. Bir abstract class’ta bir metot varsa, o metot otomatik olarak abstract sayılır. Ama birden çok metot içerdiğinde, bazıları abstract olmayabilir.

abstract void renk (Color color);

This defines a template for a denemeod named isBlack. Notice that no body of isBlack is specified; that is left to subclasses of the class in which the abstract denemeod is declared. The subclasses must implement a body for denemeod is