我在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
答案 0 :(得分:1)
在这两种情况下,您都会将C
类型的对象传入打印功能。 bar
函数要求输入A
类型的对象,但是传递C
类型的对象仍然可以接受它,因为它是{{1}的子类}}。首先,请务必注意A
和a.foo()
在a.e
对象上被调用。
所以在这两种情况下发生的事情是它在列表中搜索最低的属性或方法。以下是Java在第1部分中所做的非常简化的版本:
C
方法!现在让我们调用它的C
方法。bar
没有foo
方法!让我们迈出C
课程的下一步,看看它是否有foo
方法。B
有一个foo
方法,所以我们来称呼它。我们无需继续前往B
课程,因为我们已经在B中找到了我们需要的东西。了解该参数是从foo
向A
转发的所有内容。在第2部分中使用完全相同的逻辑。它注意到传入了A
类型的对象,因此它从对象C
获取C
属性,因为它是最低级的在包含该属性的层次结构中。
希望能回答你的问题!