我怀疑
当我们在继承的情况下在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类的值)
答案 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中的变量具有独立的值。