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;
}
}