Kimlər üçün əlçatandır:
- private – ancaq eyni class daxilində.
- default (package private) access – private + eyni paketdəki digər classlar
- protected – default access + subclasslar
- public – protected + digər paketlərdəki classlar.
Cədvəl şəklinə salsaq daha aydın görsənəcək:
Access Modifier | class daxilində | paket daxilində |
Digər paketlərdən ancaq subclass ilə | digər paketlərdən |
private |
bəli | xeyr | xeyr | xeyr |
default |
bəli | bəli | xeyr | xeyr |
protected |
bəli | bəli | bəli | xeyr |
public |
bəli | bəli | bəli | bəli |
private
, default və public
açar sözlərinin istifadəsi protected
`ə nisbətən daha sadədir. Əvvəlcə bu modifier`lər ilə bağlı nümunələrə baxaq, sonra protected
`ə ayrıca baxarıq:
package az.mm.A; public class AccessModifiers { private String secretText; String friendlyText; public String forEveryOneText; public void displaySecretText() { System.out.println(secretText); // it is ok } } class Test { public static void main(String[] args) { AccessModifiers am = new AccessModifiers(); System.out.println(am.forEveryOneText); System.out.println(am.friendlyText); System.out.println(am.secretText); // DOES NOT COMPILE } }
package az.mm.B; import az.mm.A.*; public class Other { public void display() { AccessModifiers am = new AccessModifiers(); System.out.println(am.forEveryOneText); // it is ok System.out.println(am.friendlyText); // DOES NOT COMPILE System.out.println(am.secretText); // DOES NOT COMPILE } }
protected
ilə bağlı vəziyyət daha mürəkkəbdir. Nümunələrə baxaq:
package az.mm.main; public class Bank { protected String text = "This is not public information"; protected void display(){ System.out.println(text); } }
package az.mm.main; import az.mm.banks.IBAR; public class MainService { public String getInformation() { IBAR ibar = new IBAR(); return ibar.text; } public void showInformation() { Bank bank = new Bank(); bank.display(); } }
package az.mm.banks; import az.mm.main.Bank; public class IBAR extends Bank { public void method1() { System.out.println(text); display(); } public void method2() { IBAR ibar = new IBAR(); System.out.println(ibar.text); ibar.display(); } public void method3() { Bank bank = new Bank(); System.out.println(bank.text); // DOES NOT COMPILE bank.display(); // DOES NOT COMPILE } public void method4() { Bank ibar = new IBAR(); System.out.println(ibar.text); // DOES NOT COMPILE ibar.display(); // DOES NOT COMPILE } }
package az.mm.banks; public class BankService { public String getInformation(){ IBAR ibar = new IBAR(); return ibar.text; // DOES NOT COMPILE } }
package az.mm.other; import az.mm.banks.IBAR; public class OtherService { public String getInformation(){ IBAR ibar = new IBAR(); return ibar.text; // DOES NOT COMPILE } }
MainService
classında gördüyünüz kimi eyni paketdəki digər class daxilində çağırıldıqda problem yoxdur. Amma fərqli paketdən ancaq subclass vasitəsi ilə çağırıla bilər, bu səbəbdən IBAR
classında method1()
və method2()
xəta vermir. Amma subclassda Bank
classının öz referansı vasitəsi ilə protected
üzvlərə müraciət edilə bilməz, buna görə də method3()
və method4()
xəta verir. Bu nüans ilə bağlı Chapter 5`də varislik mövzusunda ayrıca təkrar baxacağıq. Amma subclassın referansı vasitəsilə fərqli paketdən çağırıldıqda yenə xəta verir (BankService
və ya OtherService
classlarında göstərildiyi kimi), subclassın referansı vasitəsi ilə ancaq subclassın öz daxilindən çağırmaq mümkündür.
[topics lang=az]