繁体   English   中英

在Java中更改最后一个字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM