Почему методы родительского класса, используемые дочерним объектом класса, вызывают ошибки? - PullRequest
0 голосов
/ 26 февраля 2020

Я сейчас беру урок о Java и пытаюсь понять проблему, с которой столкнулся. Предположим, что существует следующий код:

public class Parent
{
     public Parent()
     {}
}
public class Child extends Parent
{
     private int num;
     public Child
     {
          super();
          num = 1;
     }
     public int getNum()
     {
          return num;
     }
}

Затем в отдельном классе из Parent или Child:

Parent a = new Child();
System.out.print(a.getNum());

, который должен обеспечить вывод:

1

Из того, что я узнал, это должно выполняться без ошибок, поскольку часть кода new Child() должна определять, к какому классу относится экземпляр объекта, а часть Parent a должна выделять пространство. в памяти для объекта Parent, названного «a», который может заполнить объект Child, поскольку он является подклассом класса Parent. Тот факт, что это пространство сохраняется для родительского объекта, просто диктует, что если бы метод появился в классах Parent и Child с разными описаниями, описание метода класса Parent будет иметь приоритет над описание метода Child class (и противоположное описание будет иметь приоритет, если пространство, отведенное для a, будет для Child объекта (er go Child a = et c.)).

Мне также сказали, что такая ситуация может привести к ошибке. Я чувствую, что есть что-то, что я серьезно неправильно понимаю в отношении Наследования в целом, хотя везде, куда я смотрю, кажется, что они дают мне разные ответы и противоречивые данные (это, скорее всего, связано с неопытностью в языке, хотя информация все еще не передается, потому что этого). Хотел бы кто-нибудь объяснить, почему этот код дает ответ, который он дает, и как мне следует что-то изменить в этом коде, чтобы он дал ожидаемый результат, и почему новый код работает? Заранее спасибо.

1 Ответ

2 голосов
/ 26 февраля 2020

Строки, приведенные ниже, не будут скомпилированы, потому что вы не определили getNum() в Parent.

Parent a = new Child();
System.out.print(a.getNum()); // Won't be compiled

Как только вы определите getNum() в Parent, например, как указано ниже

public int getNum() {
    return 0;
}

следующие строки будут успешно скомпилированы, и вы получите 1 в качестве вывода

Parent a = new Child();
System.out.print(a.getNum());

В этом случае ссылка a сможет разрешить getNum() и затем он проверит экземпляр, на который указывает. Поскольку он указывает на экземпляр Child, он вернет 1 (из версии getNum() ребенка).

Если вы не определили getNum() в Parent и по-прежнему если вы хотите вызвать getNum(), используя его ссылку, вам нужно привести ссылку на Child следующим образом, и тогда она будет скомпилирована и успешно выполнена:

Parent a = new Child();
System.out.print(((Child) a).getNum());

Вывод:

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