1

我有这样的事情:

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

class B extends A {}

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

4

4 回答 4

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在构造函数完成运行之前“泄漏”了对某个地方的引用,从而破坏了通常的 final 不变性保证。

于 2012-12-10T21:39:41.607 回答
1

只有给定的代码,不,除了 1 从getF(). 我怀疑还有更多的故事。例如,如果您getF()B或 的子类中覆盖 ,B您可能会得到不同的结果。

于 2012-12-10T21:35:13.837 回答
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());
  }
}
于 2012-12-10T21:41:06.747 回答
0

根据您提供的信息,返回 0 是不合法的。然而,它有半合法和其他骇人听闻的方式发生。要诊断此问题,您需要做的是在您看到返回 0 的代码上放置条件停止点。我怀疑存在的结构不是您期望的结构,调试器应该向您显示结构以及为什么值为 0。

于 2012-12-10T21:57:09.317 回答