Вопрос о перезаписанных методах в классах, расширяющих друг друга. - PullRequest
0 голосов
/ 22 сентября 2018

Я учусь на Java-экзамене и у меня есть вопрос, касающийся статических и динамических типов.

У меня есть 4 класса: A, B, C и Main.

public class A {
   private void tell(){
   System.out.println("AA");
    }
}

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

public class C extends B {

}

public class Main{
public static void main(String[] args) {
    A c = new C();       
    c.tell();
}

}

Мое предложение было таким: вывод должен быть "BB", потому что c имеет динамический тип C. Поскольку у C нет метода "сказать", используется метод высшего класса B,который печатает «BB».

В результате, однако, возникает ошибка, потому что Java ищет слово «tell» в A. В A он, конечно, не может его найти, потому что там он объявлен priavte.Но почему он выглядит в A, хотя только статический тип - A, а динамический тип - C?

1 Ответ

0 голосов
/ 22 сентября 2018

Вы получаете ошибку, потому что во время компиляции компилятор не знает фактический экземпляр, который будет помещен в A, поэтому, когда компилятор видит c.tell(), он смотрит только на класс A, который действительно не имеетдоступный tell() метод.

Один из способов понять это с помощью этого примера:

public class A {
  private void tell(){
      System.out.println("AA");
  }
}

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

public class C extends A {

}

public class Main{
  public static void main(String[] args) {
      A b = new B();      
      b.tell();
      A c = new C();       
      c.tell();
  }

}

Вы можете видеть, что первые 2 строки будут в порядке (согласно вашей текущей логике мышления)).B имеет метод tell(), поэтому b должен иметь возможность вызывать tell().Но при использовании точно такого же присваивания с другим подклассом C, который не имеет метода tell(), ваша логика потерпит неудачу.A и C имеют метод tell(), поэтому программа внезапно вызывает метод, который не существует или недоступен.

...