1

私はコードを書きました:

public class Child{
int y ;
private static final int z = getZ();

static {
    System.out.println("The value of z is "+z);
}

public int getX(){
    System.out.println("get x");
    return 10;
}

public int getY(){
    Child ch = new Child();
    System.out.println("get y");
    ch.y = getX();
    return y;
}

public static int getZ(){
    System.out.println("get z");
    return new Child().getY();
}

public Child(){
    System.out.println("Child constructor");
}


public static void main(String...args){
    Child ch = new Child();
    System.out.println("the value of z in main is "+z);
}
}

出力は次のとおりです。

get z
子コンストラクタ
子コンストラクタ
get y
get x
z の値は 0
子コンストラクタ
main の z の値は 0

z の値が 10 ではなく 0 である理由を誰か説明してもらえますか?

編集:-皆さん、ありがとうございます。最初の質問に対する回答が得られました。クラスがロードされた後、クラスの最初のオブジェクトがインスタンス化される前に静的ブロックが実行されることを知る限り、私にはまだ疑問があります。それでは、SOP("The value of z is "+z)" は SOP("Child constructor") の前に実行されるべきでした! そうじゃない?

4

6 に答える 6

7

getY() を見てください:

public int getY(){
    Child ch = new Child();
    System.out.println("get y");
    ch.y = getX();
    return y;
}

最初の 3 行は関係ありません。このy場合、返される値は変更されません。

インスタンスを構築しているのと同じクラスの初期化中に呼び出された、率直に言ってスパゲッティコードで非常に多くの無意味なオブジェクトを作成しています。コードをこれよりもずっとシンプルに保つことをお勧めします。静的イニシャライザは、最初から可能な限り避けるべきです。家中を行き来して何の役にも立たないものは言うまでもありません。

于 2012-01-31T17:50:52.730 に答える
5

getY()は 10 に設定ch.yされますが、 の値が返されるためですthis.y

于 2012-01-31T17:52:21.070 に答える
2

GetY では、決して設定されない this.y を返します。

于 2012-01-31T17:53:31.823 に答える
2

getY() で、Child ch インスタンスではなく、初期化されていない y 変数を返しました。

于 2012-01-31T17:54:15.083 に答える
1

これは、getY() メソッド内で新しい CHild オブジェクトを作成し、変数 y のインスタンスに 10 を割り当て、y を返すと、それが現在のインスタンス変数 y になるためです。それが説明することを願っています。

于 2012-01-31T17:57:34.207 に答える
0

2番目のポイントとして、静的フィールドと静的ブロックはテキストの順序で初期化/実行されます。

例えば:

public class StaticTest()
{
  static
  {
    System.out.println("s1 in block 1 :" + s1);
  }

  private static String s1 = "s1";

  static
  {
    System.out.println("s1 in block 2 : " + s1);
  }

  public static void main(String args[])
  {
    new StaticTest();
  }
}

これの出力は次のようになります -

ブロック 1 の s1 :

ブロック 2 の s1 : s1

于 2012-01-31T22:31:02.923 に答える