Widziałem różne artykuły na temat różnic między chronionymi i pakietowymi modyfikatorami prywatnymi. Jedną rzeczą znalazłem sprzeczności między tymi dwoma stanowiskróżnice między modyfikatorami chronionymi i pakietowymi prywatnymi w Javie?
Isn't "package private" member access synonymous with the default (no-modifier) access?
W ten przyjętą odpowiedź mówi, że
Zabezpieczony modyfikator określa, że państwa mogą być dostępne tylko w ramach własnej opakowaniu (tak jak w przypadku pakietu-private), a dodatkowo przez podklasę swojej klasy w innym pakiecie.
Why the protected modifier behave differently here in Java subclass?
W tym zaakceptowanej odpowiedzi mówi, że
Aby zaspokoić Protected Access poziomu muszą być spełnione dwa warunki:
- Zajęcia muszą być w tym samym opakowaniu .
- Musi istnieć relacja dziedziczenia.
nie są one sprzeczne? Z mojego zrozumienia innych artykułów, pierwszy post daje prawidłową odpowiedź, która chroniła == pakiet-prywatny + podklasa w innym pakiecie.
Jeśli to stwierdzenie jest prawdziwe, to dlaczego tego kodu nie powiedzie się z następującym komunikatem o błędzie na moim podklasy Kotka na linii 17
The method testInstanceMethod() from the type Animal is not visible
mój kod Super i podklasy są poniżej.
package inheritance;
public class Animal {
public static void testClassMethod() {
System.out.println("The class" + " method in Animal.");
}
protected void testInstanceMethod() {
System.out.println("The instance " + " method in Animal.");
}
}
package testpackage;
import inheritance.Animal;
public class Cat extends Animal{
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
myAnimal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
Proszę wyjaśnić, dlaczego powyższy kod nie powiedzie się. To byłoby bardzo przydatne. Dzięki
Musisz być kotem, aby użyć metody testInstanceMethod(). Casting to Animal ogranicza dostęp do tej metody do pakietu, a ponieważ twoja główna jest w innym pakiecie, kod zawodzi. (Myślę, że nie skompilowałoby się). Tak, istnieje ta metoda, ale nie masz uprawnień dostępu do niej, ponieważ jest ona zadeklarowana w Animal przez chronione. – PSIXO
Drugie stwierdzenie powinno być sformułowane jako: * "Aby spełnić poziom chronionego dostępu, ** jeden z ** dwóch warunków musi być spełniony ..." * (Zobacz także komentarz, który napisałem poniżej tej odpowiedzi.) – aioobe