Почему в родительском классе обязательно иметь дочерний метод для вызова его со ссылкой на родительский класс, который ссылается на объект дочернего класса? - PullRequest
1 голос
/ 30 августа 2009
public class A
{  }

public class B extends A
{
  public void add()
  {
   System.out.println("add in B");
  }
}

Теперь здесь, если мы вызываем add следующим образом, тогда это выдает ошибку: A a1 = новый B; a1.add ();

Но когда мы добавляем метод add () в класс A и затем вызываем аналогичным образом, вызывается метод add () дочернего класса.

т.е.

public class A
{
  public void add()
  {
   System.out.println("add in A");
  }
}

public class B extends A
{
  public void add()
  {
   System.out.println("add in B");
  }
}

звоните:

A a1 = new B;
a1.add();

выход:

добавить в B

Почему это так?

Ответы [ 5 ]

2 голосов
/ 30 августа 2009

при вызове метода a1.add () компилятор проверяет, присутствует ли метод. Но он знает только, что a1 является ссылкой на объект класса A, у которого нет этого метода. Таким образом, компиляция не удалась.

В этом тривиальном примере компилятору, вероятно, будет легко вывести правильный тип. Но в более общих случаях это не так. И поэтому такая логика не является частью спецификации.

1 голос
/ 30 августа 2009

Поскольку java не знает во время компиляции, что a1 будет ссылаться на экземпляр B во время выполнения. Он знает только объявленный тип, поэтому он разрешает только вызовы, которые работают с объявленным типом.

0 голосов
/ 06 декабря 2011

Хорошие ответы ... У меня тоже были сомнения по этому поводу, но теперь я ясно :) И еще одна вещь ... вам не нужно объявлять абстрактный метод, просто создайте пустой метод с тем же именем и сигнатурой в родительском классе, и "вуаля" - все ошибки компиляции исчезли;)

В вашем случае вы можете добавить такой метод void add () {}, и у вас не возникнет никаких проблем

0 голосов
/ 30 августа 2009

Вы хотите вызвать метод объекта объявленного типа A, но реализовать его только в подклассе B в A. В этой ситуации вы обычно делаете A абстрактный класс и объявляете add () абстрактным методом в A.

0 голосов
/ 30 августа 2009

Когда компилятор Java просматривает ссылку a1, он знает, какие методы доступны. В первом примере класс A не имеет add() в своем API. В этом случае разрешено выполнять приведение от a1 к B следующим образом:

((В) а1) .Добавьте ();

и компилятор не будет жаловаться.

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