我有一个疑问
当我们在实例初始化 block 中初始化实例变量(在继承的情况下)时,它们会覆盖变量的值吗?
例如
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
但是当我使用初始化 block 时
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
为什么会这样呢?为什么我的初始化 block 会影响实例变量?此外,我知道当我们创建对象时会调用 block ,但输出处的变量仍然应该对应于变量类型,即 A K(K 应该给出与 A 类相对应的值)
最佳答案
您只能重写方法,不能重写变量。此代码不是“重写”实例变量。
第一个示例为 A 和 B 定义了名为 x 的不同变量,使变量成为 A 意味着您会看到为 A 定义的变量 ( see the link provided by paulk23 )。在第二个中,只有一个实例变量 x 对子类可见,实例初始值设定项将一个值分配给现有变量。
关于java - 多态性中的初始化 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22464401/