Java中的继承

Num*_*tor 3 java inheritance

我遇到了关于网络上遗传的这个例子,我对它的结果并不容易.我错过了一些关键的东西.

public class A {

int i = 5;

public A() {
    foo();
}

private void foo() {
    System.out.println(i);

}}

public class B extends A {
int i = 6;}

public class C extends B {
int i = 7;

public void foo() {
    System.out.println("C's foo");
    System.out.println(super.i);
}}
Run Code Online (Sandbox Code Playgroud)

我试图通过以下命令弄清楚发生了什么: C c = new C(); System.out.println(C.i);

我知道当我们创建一个新的实例时,C我们接近A和B的构造,所以我们达到A()- (问题1)iA(A)是否在路上初始化?现在我们需要打电话给foo()- (问题2) - C是否foo()认为是A的覆盖foo()?如果B有foo()自己的怎么办?然后它被认为是一个覆盖和C的foo()运作?

据我所知,当它与局部变量相关时没有覆盖.怎么会System.out.println(c.i)是7而不是5?不应该i是最高父亲的吗?

编辑:我的问题不是关于当我使用c时将使用哪个foo和i,是关于在这两个特定命令期间发生的事情,显然导致A的foo被使用而不是C的.

非常感谢你.

Jon*_*eet 5

i这里的三个变量是完全独立的.任何语句使用哪一个在编译时确定- 不涉及多态.因此A.foo()将始终打印出声明的变量的值A.

请注意,顺便说一下这些不是局部变量 - 它们是实例变量.

当你打印输出c.i使用声明的变量C因为编译时类型cC.如果你写,你可以看到这个:

C c = new C();
A a = c;
B b = c;
System.out.println(a.i); // 5 - variable declared in A
System.out.println(b.i); // 6 - variable declared in B
System.out.println(c.i); // 7 - variable declared in C
Run Code Online (Sandbox Code Playgroud)

请注意,在编写良好的程序中,这种事情几乎从不会导致问题,因为变量应该是私有的.