Erişim Belirtkeleri

(Access Modifiers)

 

Bir java deyimi (belli bir iş yapan kod veya kodlardan oluşan blok) bir değişkeni çağırabiliyorsa (kullanabiliyorsa), o kod sözkonusu değişkene erişebiliyor, denir. Benzer olarak, bir java kodu bir metodu çağırabiliyorsa, o kod sözkonusu metoda erişebiliyor, diyoruz. Bir sınıfın içindeki kodlar, başka bir sınıfın içindeki değişkenlere ve metotlara erişebiliyorsa, o sınıf sözkonusu sınıfa erişebiliyor, diyoruz. Paketler için de benzer tanım geçerlidir.

Bir Java öğesi (değişken, metot, sınıf, paket) tanımlanırken, o öğeye kimlerin erişebileceğini belirtme olanağı vardır. Bunlara Erişim Belirtkeleri (Access modifiers, access levels) denir. Java terimleriyle söylersek, erişim belirtkeleri sistemin güvenliğini sağlar. Dört tane erişim belirtkesi vardır:

Ön-tanımlı, private, protected, public.

 

Erişim Belirtkesi

İzinler

public

Bütün sınıflar erişebilir

private

Alt-sınıf dahil başka hiçbir sınıf erişemez

protected

Alt-sınıflar ve aynı pakettekiler erişebilir

private protected

Yalnızca alt sınıflar erişebilir

<default> (ön-tanımlı)

Aynı pakettekiler erişebilir

Uyarı: Java 1.0 sürümünden önce varolan private protected belirtkesi, sonraki sürümlerden kaldırılmıştır. Yeni programlarda kullanılmaması gerekir. Ancak Java 1.0 sürümünden önce yazılmış programlarda yer almıştır.

 

1. public

public damgası bir değişkeni, bir metodu ya da bir sınıfı niteleyebilir. Nitelediği öğeler herhese açık olur. Başka pakette olsa bile, program içindeki, her kod onlara erişebilir. public damgalı bir sınıfın değişkenlerine ve metotlarına kendi alt-sınıfları ve dışarıdaki başka sınıflar kısıtsız erişebilir. public damgalı değişkenler ve metotlar için de kısıtsız erişim vardır. Uygulama programlarında main() metodunun public damgalı olmasının nedeni budur.  Örnekler:

 

a. public sınıf bildirimi

public class class_adı {

            Class gövdesi

}

b. public değişken bildirimi

public long  r ;

c. public metot bildirimi

public  double toplam(int m, double  d){

return m + d ;

}

 

 

2. private

Bazı değişken, metot ya da sınıflara başka sınıftaki kodların erişmesini engellemek isteyebiliriz. Bunun için private nitelemesini kullanırız. private erişim belirtkesi, public belirtkesinin karşıtı gibidir. private   damgalı öğelere yalnız aynı sınıftaki kodlar erişebilir, başka sınıftaki kodlar erişemez. Kendi alt-sınıfları bile erişemez. Bir alt-sınıf, atasının public ve ön-tanımlı öğelerine erişebilir, ama private öğelerine erişemez. Onlara erişebilmesi için, super class interface-fonksiyonu kullanılır. Bunun nasıl olduğunu ileride göreceğiz. Sözdizimi şöyledir:

a. private sınıf bildirimi

private class class_adı {

            Class gövdesi

}

b. private değişken bildirimi

private long  r ;

c. private metot bildirimi

private  double toplam(int m, double  d){

return m + d ;

}

 

3. protected

Bir sınıf içindeki değişken ve metotlara alt-sınıfların erişebilmesini, ama paket içindeki ya da program içindeki başka kodların erişmesini engellemek isteyebiliriz. Bunun için sözkonusu öğeyi, protected damgası ile nitelemek yetecektir. Bu demektir ki, alt-sınıf, üst-sınıfın protected damgalı öğelerine sanki public öğelermiş gibi erişir. Görüldüğü gibi, protected belirtkesi, ön-tanımlı belirtke ile private belirtkesinin işlevleri arasında bir işleve sahiptir. Alt sınıflara erişme yetkisi verdiği için, kalıtım (inheritance) olgusunda önemli rol oynar.  Sözdizimi şöyledir:

a. protected  sınıf bildirimi

protected class class_adı {

            Class gövdesi

}

b. protected değişken bildirimi

protected long  r ;

c. protected metot bildirimi

protected  double toplam(int m, double  d){

return m + d ;

}

 

1. Ön-tanımlı (default ) belirtke

Bir öğenin önüne hiçbir erişim belirtkesinin konmadığı durumdur. Erişim belirtkesi konmamışsa ön-tanımlı (default) belirtke etkin olur. Buna, bazı kaynaklarda dostça erişim (frendly access) denir.

a. paket  bildirimi

Paketler yalnızca ön-tanımlı erişime sahiptir, başka erişim belirtkesi almazlar. Paket içindeki her sınıf pakette olan her değişken ve metoda erişebilir. Ama başka paketlerdeki sınıflar erişemez.

   package paket_adı {

            Paket gövdesi  }

b. erişim belirtkesiz (default) sınıf  bildirimi

Sınıf bidiriminde, sınıfın önüne hiçbir erişim belirtkesi konmazsa, o sınıf içindeki değişken ve metotlara o sınıfı içeren paketteki bütün kodlar erişebilir. Kuruluş yapısı şöyledir:

class class_adı {

    Class gövdesi

}

 

c. erişim belirtkesiz (default) metot  bildirimi

Metot bildiriminde hiçbir erişim belirtkesi konulmazsa, default belirke geçerlidir. Bu halde, class’ın kendisi, alt-sınıflar ve aynı paket içindeki diğer sınıflar erişebilir. Örnek:

int topla (int m, int n) {

   return m+n ;

}

 

d. erişim belirtkesiz (default) değişken  bildirimi

Değişken bildiriminde hiçbir erişim belirtkesi konulmazsa, ön-tanımlı (default) belirke geçerlidir. Bu halde, sınıfın kendisi, alt-sınıfları ve aynı paket içindeki diğer sınıflar erişebilir. Örnek:

float kesir;

 

Alıştırmalar:

1. Aşağıdaki kodları açıklayınız.

public int i;

private double j;

 

private int myMethod(int a, char b) {

        ...}

 

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

 

/* Bu program

   public ve  private arasındaki farkı gösteriyor.

*/

class Test {

  int a;              // default erişim

  public int b;       // public erişim

  private int c;      // private erişim

 

        //  c  ye erişen metot

  void setc(int i) { // c  ye değer atar

    c = i;

  }

  int getc() {        // c  nin değeri

    return c;

  }

}

 

 

class AccessTest {

  public static void main(String args[]) {

    Test ob = new Test();

 

    // a ile b ye direkt erişilebilir

    ob.a = 10;

    ob.b = 20;

 

                   // This is not OK and will cause an error

    //  ob.c = 100;         // Hata!

 

                   // c  ye erişmek için sınıfın metodu kullanılmalı

    ob.setc(100); // geçerli

  

    System.out.println("a, b, and c: " + ob.a + " " +

                       ob.b + " " + ob.getc());

  }

}

 

3. Yukarıdaki programda yer alan aşağıdaki deyim neden geçersizdir?

  ob.c = 100;

 

4. Aşağıdaki program 10 tamsayı tutabilen bir stack yaratır. Programı çözümleyiniz.

 

        // 10 tamsayı tutabilen bir stack yaratır

class Stack {

    /*

            private damgalı stk ve top değişkenleri, dışarıdaki kodlarla

            yanlışlıkla ya da kasıtlı olarak değiştirilemez.

    */

  private int stk[] = new int[10];

  private int top;

 

        // stack’ın üstü (top) için ilk değer atar

  Stack() {

    top = -1;

  }

 

        // stack içine bir öğe teper

  void push(int item) {

    if(top==9)

      System.out.println("Stack doldu.");

    else

      stk[++top] = item;

  }

 

        // stack’tan bir öğe çeker

  int pop() {

    if(top < 0) {

      System.out.println("Stack dolmadı.");

      return 0;

    }

    else

      return stk[top--];

  }

}

 

5. Stack ‘ı test ediniz.

class DeneStack {

  public static void main(String args[]) {

    Stack st1 = new Stack();

    Stack st2 = new Stack();

 

        // stack’a sayı tep

    for(int i=0; i<10; i++) st1.push(i);

    for(int i=10; i<20; i++) st2.push(i);

 

        // stack’tan sayı çek

    System.out.println("Stack in st1:");

    for(int i=0; i<10; i++)

       System.out.println(st1.pop());

 

    System.out.println("Stack in st2:");

    for(int i=0; i<10; i++)

       System.out.println(st2.pop());

 

                   // bu deyimler geçersizdir

    // st1.top = -2;

    // st2.stk[3] = 100;

  }

}