среда, 12 декабря 2007 г.

Java Puzzle 66: A Private Matter

Что напечатает следующая программа?
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);
    }
}

Комментариев нет:

Отправить комментарий