【发布时间】:2018-08-26 21:38:57
【问题描述】:
关于以下情况:
public class A {
int x=3;
public A() {
setX(x-3);
}
void setX(int z) {
this.x = z;
}
}
public class B extends A {
static int x = 7;
void setX(int z) {
x = z;
}
}
public class Main {
public static void main(String[] args) {
A ab = new B();
System.out.println(B.x);
}
}
输出:0
我已经熟悉这样一个事实,即在我们以这种方式创建对象时执行子类的方法。
从输出来看,B类中的setX方法将继承的x作为参数,但对静态变量有副作用。这种行为是否有名称或更一般的解释?例如,不了解的人可能会认为,该方法将静态变量作为参数,并对继承的变量产生副作用。
【问题讨论】:
-
输出不是你说的3。输出为 0。
-
是的,我现在在问题中更改了它。
-
“是否有此行为的名称或更一般的解释” - 为什么?请注意,
B.x与x在A中的关系绝对为零,它们 100% 不相关。您只是在调用一个带有参数的方法,该方法被覆盖,就是这样。 -
您是指
System.out.println(B.x);中的ab.x还是B.x?
标签: java inheritance arguments subclass side-effects