Пожалуйста, просмотрите демо-версию кода следующим образом, и у меня возникло непонимание проблемы наследованияHierarchy о литье. Как показано на следующем примере, правильным результатом является Baz 1 Foo 3. Я не понимаю, почему мы получаем этот ответ.Использование литья в наследствоИерархия?
То, что я думаю, определяет тип времени компиляции e, который имеет тип Object. Ошибка компиляции не возникает, когда литье Foo, потому что отбрасывание и отбрасывание - это нормально. Кроме того, тип Foo имеет метод .one(). Затем рассматривая тип времени выполнения, что Object e = new Baz(); и тип Baz может быть применен к типу Foo, потому что отливка над типом выполнения объекта в порядке. Таким образом, нет времени выполнения и определения результата. Я думаю, что кастинг означает, что один тип объекта превращается в другой, так что теперь E - это тип Foo и просто проверяйте метод один в стиле Foo. Я получаю «Foo1». И это неправильно. Может ли кто-нибудь помочь мне решить эту проблему? Спасибо!
public class inheritanceHierarchy
public static void main(String[] args) {
class Foo {
public void one() {
System.out.println("Foo 1");
}
public void three() {
System.out.println("Foo 3");
}
}
class Baz extends Foo {
public void one() {
System.out.println("Baz 1");
super.three();
}
public void two() {
System.out.println("Baz 2");
}
}
Object e = new Baz();
((Foo) e).one();
}
}
Как в стороне, я думаю, что ваш пример будет более ясным, если бы вы не объявляли классы в рамках методов - это очень * необычная техника для использования. Просто объявляйте их как отдельные типы верхнего уровня, в идеале, все ваши типы следуют соглашениям об именах Java. –
Этот вопрос едва различим, и я едва могу разобрать его текст. – oarfish