java - 多态性中的初始化 block

标签 java scjp

我有一个疑问

当我们在实例初始化 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/

相关文章:

java - 行、模型行和 View 行的有趣行为 - 何时使用哪一个?

java - 论坛设计的混合内容警告

java - Android - 如何创建类似 html 文本区域的 EditText

java - Apache Camel 路由到路由时生成异常

java - 与 indexOf 一起使用 Comparable

java - 垃圾收集 - 空引用和引用新对象

java - mediaPlayer CompletionListener 在完成歌曲之前播放下一首歌曲

java - Arrays.BinarySearch 是否要求数组按升序排序

java - 所有 Java 证书的映射在哪里?

java - 当开关不支持 boolean 数据类型时,为什么 boolean 表达式在 case block 中有效?