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コンストラクターの実行が完了する前に、コンストラクターがアクセスできる場所への参照を「リーク」した場合、ファイナルの通常の不変性保証が破られます。

于 2012-12-10T21:39:41.607 に答える
1

与えられたコードだけでは、いいえ、 から 1 しか取得できませんgetF()。この話にはまだ続きがあると思います。たとえばgetF()BまたはのサブクラスでをオーバーライドするとB、異なる結果が得られる可能性があります。

于 2012-12-10T21:35:13.837 に答える
0

あなたが提供した情報から、0 が返される正当な方法はありません。ただし、それが発生するための半合法的およびその他のハックな方法があります。この問題を診断するために必要なことは、0 が返されるコードに条件付き停止ポイントを配置することです。存在する構造は期待したものではないと思われます。デバッガーは構造と値が 0 である理由を表示する必要があります。

于 2012-12-10T21:57:09.317 に答える
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 に答える