Что напечатает следующая программа?
class Base {
public String name = "Base";
}
class Derived extends Base {
private String name = "Derived";
}
public class PrivateMatter {
public static void main(String[] args) {
System.out.println(new Derived().name);
}
}
Программа не скомпилируется. Дело в том, что поля класса не могут переопределять поля суперкласса как, например, методы. В данном случае класс Derived скрывает поле name класса Base (JLS 8.3). Это корректно, но нерекомендуется, так как противоречит принципу Лискова: если что-то можно делать с базовым классом, то то же самое должно быть возможно делать с его потомком. Чтобы решить проблему с доступом к полю name класса base надо переписать код так:
public class PrivateMatter {
public static void main(String[] args) {
System.out.println(((Base) new Derived()).name);
}
}
Комментариев нет:
Отправить комментарий