Java - 理解继承的问题

时间:2016-11-17 14:34:37

标签: java inheritance

我在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 个答案:

答案 0 :(得分:1)

在这两种情况下,您都会将C类型的对象传入打印功能。 bar函数要求输入A类型的对象,但是传递C类型的对象仍然可以接受它,因为它是{{1}的子类}}。首先,请务必注意Aa.foo()a.e对象上被调用。

所以在这两种情况下发生的事情是它在列表中搜索最低的属性或方法。以下是Java在第1部分中所做的非常简化的版本:

  1. 嘿,您已将[{1}}类型的对象传入C方法!现在让我们调用它的C方法。
  2. 糟糕! bar没有foo方法!让我们迈出C课程的下一步,看看它是否有foo方法。
  3. 耶! B有一个foo方法,所以我们来称呼它。我们无需继续前往B课程,因为我们已经在B中找到了我们需要的东西。
  4. 了解该参数是从fooA转发的所有内容。在第2部分中使用完全相同的逻辑。它注意到传入了A类型的对象,因此它从对象C获取C属性,因为它是最低级的在包含该属性的层次结构中。

    希望能回答你的问题!