[英]Change a final field in Java
我有这样的事情:
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
引用“泄漏”到构造函数完成运行之前可以访问它的某个地方,从而打破了终结者通常的不变性保证。
只有给定的代码,不,除了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。 然而,它有半合法和其他hacky方式发生。 要诊断此问题,您需要做的是在您看到返回0的代码上放置条件停止点。 我怀疑存在的结构不是您期望的结构,调试器应该显示结构以及值为0的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.