2015-12-15 3 views
1

Пожалуйста, просмотрите демо-версию кода следующим образом, и у меня возникло непонимание проблемы наследования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(); 
    } 
} 
+1

Как в стороне, я думаю, что ваш пример будет более ясным, если бы вы не объявляли классы в рамках методов - это очень * необычная техника для использования. Просто объявляйте их как отдельные типы верхнего уровня, в идеале, все ваши типы следуют соглашениям об именах Java. –

+0

Этот вопрос едва различим, и я едва могу разобрать его текст. – oarfish

ответ

4

Я думаю, что литейные означает сделать один тип объекта превращаются в другой, так что е типа Foo сейчас и просто проверить метод один в типа Foo.

No. Casting не меняет тип объекта вообще. Это дает вам только выражение целевого типа. Так, например:

String x = "foo"; 
Object y = x; 
String z = (String) y; 

Здесь у нас есть три ссылки, все на один и тот же объект. Объект не меняет своего типа, а значения переменных не являются объектами - это просто ссылки. Это важно, что вы это понимаете.

Так что в вашем случае единственным объектом по-прежнему является экземпляр Baz, поэтому, когда вы вызываете one(), вы все равно заканчиваете вызов переопределения в пределах Baz.

+0

О, я вижу. Спасибо! – user1234567

0

Наследование также позволяет использовать полиморфизм, так что вместо литья вашего объекта База на объект Foo, вы можете создать экземпляр объекта База, как это: Foo e = new Baz();

Это позволяет получить доступ как к супер-классу и субу -классные методы. Однако это не меняет того факта, который указал Джон Скит, что вы переопределяете метод one() в подклассе.

+0

Это имеет смысл. спасибо – user1234567

Смежные вопросы