我有这样的事情:
class A {
final int f = 1;
int getF() {
return f;
}
}
class B extends A {}
是否可以在B类中调用getF()并从中获取0?这个最终字段可以从1开始有另一个值吗?因为我有时从getF()获得0结果,并且不知道会发生什么。没有覆盖什么的。只需调用getF()并获得0.在某些情况下。有人可以猜到为什么会这样吗?
答案 0 :(得分:3)
我能想到的唯一情况组合就是允许这样,如果在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
引用,可以在构造函数运行完毕之前访问它,从而打破了终结者通常的不变性保证。
答案 1 :(得分:1)
只使用给定的代码,不,除getF()
之外的任何东西都不可能得到1。我怀疑这个故事还有更多。例如,如果您在getF()
或B
的子类中覆盖B
,则可能会得到不同的结果。
答案 2 :(得分:0)
这是你在寻找什么?
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());
}
}
答案 3 :(得分:0)
根据您提供的信息,没有合法的方式返回0。 然而,它有半合法和其他hacky方式发生。诊断此问题需要做的是在您所在的代码上放置条件停止点 看到0被退回。我怀疑存在的结构不是你期望的结构, 调试器应该显示结构以及值为0的原因。