我有这样的事情:
class A {
final int f = 1;
int getF() {
return f;
}
}
class B extends A {}
是否可以在 B 类中调用 getF() 并从中获取 0?这个最终字段可以有另一个从 1 开始的值吗?因为我有时从 getF() 得到 0 结果并且不知道会发生什么。没有覆盖或其他东西。只需调用 getF() 并得到 0。在某些情况下。有人能猜到为什么会这样吗?
我能想到的唯一允许这种情况的组合是,如果 A 之上有另一个类声明了一个由其构造函数调用的方法,并且 B 覆盖了该方法并getF
从那里调用
class Super {
public Super() {
doInit();
}
protected void doInit() { /* ... */ }
}
class A extends Super {
// f and getF as before
}
class B extends A {
protected void doInit() {
System.out.println(getF());
}
}
或者类似地,如果构造函数this
在构造函数完成运行之前“泄漏”了对某个地方的引用,从而破坏了通常的 final 不变性保证。
只有给定的代码,不,除了 1 从getF()
. 我怀疑还有更多的故事。例如,如果您getF()
在B
或 的子类中覆盖 ,B
您可能会得到不同的结果。
这是你想要的??
public class A {
final int f = 1;
int getF() {
return f;
}
}
public class B extends A {
public int getF() {
return f;
}
public void setF(int f) {
this.f = f;
}
int f;
public B(){
f=0;
}
public static void main(String args[]) {
B a = new B();
System.out.println(a.getF());
}
}
根据您提供的信息,返回 0 是不合法的。然而,它有半合法和其他骇人听闻的方式发生。要诊断此问题,您需要做的是在您看到返回 0 的代码上放置条件停止点。我怀疑存在的结构不是您期望的结构,调试器应该向您显示结构以及为什么值为 0。