W Javie możemy za pomocą odpowiednich modyfikatorów dostępu pozwalają decydować, jak dużo metod czy pól klasy udostępnimy innym klasom. Istnieją cztery modyfikatory dostępu:
public
– pozwala na dostęp do danego elementu ze wszystkich klasprotected
– pozwala na dostęp do danego elementu tylko dla klas dziedziczących oraz klas z tego samego pakietudefault
– pozwala na dostęp do danego elementu tylko klasom z danego pakietu (nie istnieje słowo w Javie określające ten rodzaj dostępu, jeżeli chcemy go użyć to po prostu nie podajemy żadnego modyfikatora)private
– dostęp do danego elementu ograniczony tylko do klasy w którym jest zdefiniowany
Modyfikator public
i private
dużego problemu sprawiać raczej nie będzie. Pierwszy umożliwia dostęp do poszczególnej metody bądź pola z każdej klasy, drugi zabrania dostępu każdemu (i przy okazji powoduje, że dany element nie podlega dziedziczeniu). Trochę więcej problemów sprawiają elementy protected
i default
.
Poniżej znajduje się kod, który demonstruje, kiedy można odwoływać się do zmiennych o modyfikatorach protected
i default
. Pominąłem modyfikatory private
i public
, nic nie wnoszą a zaciemniłyby obraz.
KlasaA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | //pakietA.KlasaA package pakietA; import pakietB.KlasaC; import pakietB.KlasaD; public class KlasaA { private int zmiennaPrivate; int zmiennaDefault; protected int zmiennaProtected; public int zmiennaPublic; public void zrobCos(KlasaA a, KlasaB b, KlasaC c, KlasaD d) { a.zmiennaDefault = 10; a.zmiennaProtected = 10; b.zmiennaDefault = 10; b.zmiennaProtected = 10; // c.zmiennaDefault = 10; c.zmiennaProtected = 10; // d.zmiennaDefault = 10; d.zmiennaProtected = 10; } } |
KlasaB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //pakietA.KlasaB package pakietA; import pakietB.KlasaC; import pakietB.KlasaD; public class KlasaB extends KlasaA{ public void zrobCos(KlasaA a, KlasaB b, KlasaC c, KlasaD d) { a.zmiennaDefault = 10; a.zmiennaProtected = 10; b.zmiennaDefault = 10; b.zmiennaProtected = 10; // c.zmiennaDefault = 10; c.zmiennaProtected = 10; // d.zmiennaDefault = 10; d.zmiennaProtected = 10; } } |
KlasaC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //pakietB.KlasaC package pakietB; import pakietA.KlasaA; import pakietA.KlasaB; public class KlasaC extends KlasaA { public void zrobCos(KlasaA a, KlasaB b, KlasaC c, KlasaD d) { // a.zmiennaDefault = 10; // a.zmiennaProtected = 10; // b.zmiennaDefault = 10; // b.zmiennaProtected = 10; // c.zmiennaDefault = 10; c.zmiennaProtected = 10; // d.zmiennaDefault = 10; d.zmiennaProtected = 10; } } |
KatalogD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //pakietB.KlasaD package pakietB; import pakietA.KlasaA; import pakietA.KlasaB; public class KlasaD extends KlasaC { public void zrobCos(KlasaA a, KlasaB b, KlasaC c, KlasaD d) { // a.zmiennaDefault = 10; // a.zmiennaProtected = 10; // b.zmiennaDefault = 10; // b.zmiennaProtected = 10; // c.zmiennaDefault = 10; // c.zmiennaProtected = 10; // d.zmiennaDefault = 10; d.zmiennaProtected = 10; } } |
Generalnie w odwołaniach można zaobserwować:
KlasaB
możne odwołać się do wszystkich zmiennychKlasyA
(ten sam pakiet, dziedziczenie)KlasaC
nie może odwołać się do zmiennych z modyfikatoremdefault
KlasaC
może odwołać się do zmiennych oznaczonych jakoprotected
, ale tylko poprzez referencje doKlasyC
oraz klas potomnych, nie może się odwołać do tej zmiennej korzystając bezpośrednio z referencji doKlasyA
.KlasaA
może się odwołać do zmiennychprotected
we wszystkich klasach potomnych
#1 by Bartek on 2013/10/14 - 20:26
Totalnie nie rozumiem tego przykładu. Dlaczego np. Klasa A ma dostęp do typu protected Klas C i D skoro po nich nie dziedziczy, a obie te klasy znajdują się w innym pakiecie?