Я видел различные статьи о различиях между защищенными и частными модификаторами пакета. Одна вещь, которую я нашел противоречивой между этими двумя сообщениями
-
В этом принятом ответе говорится, что
Защищенный модификатор указывает, что доступ к элементу может быть доступен только в его собственном пакете (как в случае с пакетом-private) и, кроме того, подклассом его класса в другом пакете.
-
Почему защищенный модификатор ведет себя по-другому здесь, в подклассе Java?
В этом принятом ответе говорится, что
Чтобы обеспечить доступ к защищенному уровню, необходимо выполнить два условия:
- Классы должны быть в одном пакете.
- Должно быть отношение наследования.
Разве они не противоречат друг другу? из моего понимания других статей, первое сообщение дает правильный ответ, который защищает == package-private + подкласс в другом пакете.
Если это утверждение верно, то почему этот код не работает со следующим сообщением об ошибке в моем подклассе Cat по строке 17
The method testInstanceMethod() from the type Animal is not visible
мой код для супер и подкласс ниже.
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();
}
}
Просьба пояснить, почему приведенный выше код не работает. Это было бы очень полезно. Благодаря