наследование и ученики - PullRequest
       10

наследование и ученики

4 голосов
/ 10 февраля 2010

Дано:

class A
{
    String s = "A";
}

class B extends A
{
    String s = "B";
}

public class C
{
    public static void main(String[] args){ new C().go();}
    void go()
    {
        A a = new B();
        System.out.println(a.s);
    }
}

Вопрос:

Какие механизмы лежат в основе JVM при запуске этого кода? Почему A.s печатает обратно как «A».

Ответы [ 4 ]

4 голосов
/ 10 февраля 2010

Ссылки на поля не подлежат полиморфизму, поэтому во время компиляции компилятор ссылается на поле A, поскольку ваша локальная переменная имеет тип A.

Другими словами, поведение поля похоже на поведение перегрузки Java в методах, а не поведение переопределения Java.

2 голосов
/ 10 февраля 2010

Вы, вероятно, ожидаете, что поля будут переопределены, как метод, с динамической диспетчеризацией на основе типа времени выполнения объекта.

Это не так, как работает Java. Поля не переопределяются, они скрыты. Это означает, что объект класса B имеет два поля с именем "s", но к какому из них обращаются, зависит от контекста.

Что касается того, почему это так: не имеет смысла переопределять поля, поскольку нет никакого полезного способа заставить его работать, когда типы различаются, и просто нет смысла, когда тип такой же (как вы можно просто использовать поле суперкласса). Лично я думаю, что это просто ошибка компилятора.

1 голос
/ 10 февраля 2010

Это не полиморфизм (как отмечено).

Java имеет виртуальных методов , а не виртуальных переменных-членов - т.е. вы не переопределяете свойство - вы его скрываете.

0 голосов
/ 10 февраля 2010

Хотя переменные-члены наследуются от базового класса, они не вызываются полиморфно (т. Е. Динамический вызов не применяется к переменным-членам).

Таким образом, a.s будет ссылаться на члена в базовом классе, а не на производный класс.

Сказав это, код не следует принципам ОО. Члены класса должны быть частными / защищенными (не общедоступными или не используемыми по умолчанию) в зависимости от случая использования в бизнесе, и вам необходимо предоставить открытые методы для получения и установки значений члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...