多态中的初始化块

时间:2014-03-17 20:14:42

标签: java scjp

我怀疑

当我们在继承的情况下在Instance初始化块中初始化我们的实例变量时,它们是否覆盖变量的值?

例如

class A{
int x;
} 
class B extends A{
int x = 10;
}

public class C{
public static void main(String[] args){
A K = new B();
System.out.println(K.x); 
}
}

o/p : 0

然而,当我使用初始化块

class A{
int x;
{x = 15;}
} 
class B extends A{
{x=20;}
}

public class C{
public static void main(String[] args){
A K = new B();
System.out.println(K.x); 
}
}

OUTPUT 20

为什么会这样?为什么我的初始化块正在影响实例变量?此外,我知道当我们创建对象时会调用块,但输出中的变量仍然应该对应于变量类型,即A K(K应该给出对应于A类的值)

2 个答案:

答案 0 :(得分:1)

您只能覆盖方法,而不能覆盖变量。此代码不会覆盖"覆盖"实例变量。

第一个示例具有为A和B定义的名为x的不同变量,使变量为A表示您看到为A(see the link provided by paulk23)定义的变量。在第二个中,只有一个实例变量x对子类可见,实例初始值设定项为现有变量赋值。

答案 1 :(得分:1)

在第一个示例中,您有两个x声明,而在第二个示例中,您只有一个声明。在第二个示例中,尝试将B更改为:

class B extends A {
    int x;
    { x=20; }
}

并且您将看到与第一个示例相同的行为:B定义一个新变量,该变量与A中的变量具有独立的值。