在Java中更改最后一个字段

时间:2012-12-10 21:32:23

标签: java final

我有这样的事情:

class A {
    final int f = 1;
    int getF() {
        return f;
    }
}

class B extends A {}

是否可以在B类中调用getF()并从中获取0?这个最终字段可以从1开始有另一个值吗?因为我有时从getF()获得0结果,并且不知道会发生什么。没有覆盖什么的。只需调用getF()并获得0.在某些情况下。有人可以猜到为什么会这样吗?

4 个答案:

答案 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的原因。