这里的输出是 = 5 但不是 15 为什么
根据代码将x的值修改为15
class A {
int x = 5;
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
}
class B extends A {
int x = 10;
public B() {
this.x = 15;
}
}
public class Test {
public static void main(String[] args) {
B a = new B();
System.out.println("hello" + a.getX());
}
}
是不是因为变量的作用域
您在 B
中再次重新声明了 x
:
class B extends A {
int x = 10; // <--- here
这将创建两个名为 x
的字段。从现在开始,我将它们称为 A.x
和 B.x
。请注意,B.x
隐藏了 A.x
。这意味着如果变量的编译时类型是A
,你只能访问A.x
,而如果编译时类型是B
,您只能访问 B.x
。
当您执行 new B()
时,A.x
会初始化为 5
。 B.x
在构造函数中设置为 15
。到目前为止很简单。
但随后您调用了 getX()
。请注意,这是 A
中的一个方法。它不知道 B.x
的存在,因为在它内部,this
的编译时类型是 A
。因此,在 getX
中,this.x
表示 A.x
。这就是返回 5
的原因。
要输出15
,你可以直接访问B.x
:
System.out.println(a.x);
或者,B
可以覆盖 A.getX
和 A.setX
以返回并设置 B.x
:
class B extends A {
int x = 10;
public B() {
this.x = 15;
}
@Override
public int getX() {
return x;
}
@Override
public void setX(int x) {
this.x = x;
}
}