2016-11-17 2 views
0

У меня возникли некоторые проблемы с наследованием на Java. Я не понимаю, почему следующие две программы имеют эти выходы! Может ли кто-нибудь мне помочь? :)Java - проблемы с пониманием наследования

1)

public class A { 
    int foo() { 
     return 1; 
    } 
} 

public class B extends A { 
    int foo() { 
     return 2; 
    } 
} 

public class C extends B { 
    int bar(A a) { 
     return a.foo(); 
    } 
} 

C x = new C(); 
System.out.println(x.bar(x)); 

// OUTPUT:2 

2)

public class A { 
    int e=1; 
} 

public class B extends A { 
    int e=2; 
} 

public class C extends B { 
    int bar(A a){ 
     return a.e; 
    } 
} 

C x= new C(); 
System.out.println(x.bar(x)); 

// OUTPUT:1 

ответ

1

В обоих случаях, вы передаете в объект типа C в функцию печати. Функция bar запрашивает объект типа A, но вам все же приемлемо передать объект типа C, поскольку он является подклассом A. Поэтому, прежде всего, важно иметь в виду, что a.foo() и a.e вызывают на объекте C.

Так что происходит в обоих случаях, так это то, что он ищет самый низкий атрибут или метод в списке. Вот очень упрощенная версия того, что Java делает в части 1:

  1. Эй, вы прошли в объект типа C методу bar! Теперь давайте назовем его метод foo.
  2. Упс! C не имеет метода foo! Давайте сделаем следующий шаг до класса B, чтобы узнать, имеет ли он метод foo.
  3. Yay! B имеет метод foo, поэтому давайте назовем его. Нет необходимости работать наш путь до A класса, потому что мы уже нашли то, что нам нужно в B.

Это все о понимании того, что параметр был удручен от A к C. Точная такая же логика используется в части 2. Он замечает, что был передан объект типа C, поэтому он получает атрибут e от объекта B, так как его младший класс в иерархии содержит этот атрибут.

Надеюсь, это отвечает на ваш вопрос!

+0

Вы ошибаетесь в отношении примера 2 - там есть «1». Класс B имеет свой собственный элемент e, который скрыт для снаружи. Если бы B не имел члена e, а установил для него значение, мы получили бы результат «2», но это не так, мы читаем значение члена класса A –

+0

Hm, с вашей логикой ответ во второй программе было бы 2, не так ли? – Johanna

+0

@Johanna Вопрос для меня? –

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