tt25mrc
@tt25mrc

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Java silver SE17 第7章-22

解決したいこと

以下、質問になります。

問題

1. public class Value {
2.  public String data;
3.
4.  public Value(String data) {
5.      this.data = data;
6.   }
7.
8.   public String toString() { 
9.      return this. data;
10.  }
11.}


1. public class Sample {
2. 
3.  private static Value[] values = {
4.          new Value("A"),
5.          new Value("B"),
6.          new Value("C"),
7.          null
8.  };
9.
10. public static void main (String[] args) {
11.     System.out.println(values[1]);
12.     System.out.println(values[2]. data);
13.     System.out.println(values[3]);
14.  }
15.}

A. A、B、Cの順に表示される
B. B、C、nullの順に表示される
C. Value@7344699f、C、 nullの順に表示される
D. Value@7344699f、Value@7344699f、Cの順に表示される
E. コンパイルエラーが発生する
F. 実行時に例外がスローされる

答え B

疑問点

メソッドの動く順番が不明です。
①Sampleクラスの3行目で配列を作って要素を入れているが、10行目のmainメソッドが先に動くと思うので、3行目のメソッドが実行される前に配列の要素を呼んでいるので、答えの「B」になる理由が不明です。

②また、Sampleクラスの12行目「(values[2]. data);」のdateは構文としては間違いではないし、つけてもつけなくても、どちらでも影響はないという認識であっていますでしょうか?

以上、2点が疑問点です。
初心者で申し訳ございませんが、ご教授願います。

0

1Answer

JVMは、クラスをロードして、staticフィールドの初期化を行ってからmainメソッドを呼び出します。
そうしないと、mainメソッドからstaticフィールドを使用できません。

12行目は構文的に問題ないです。
11行目はvalues[1]でオブジェクト(Valueインスタンス)を取り出してSystem.out.printlnメソッドに渡し、System.out.printlnメソッドは渡されたオブジェクトのtoString()メソッドを呼び出してdataの文字列を取得して表示します。
12行目は、dataフィールドの文字列を取り出してSystem.out.printlnメソッドに渡し、System.out.printlnメソッドは文字列を表示します。

表示処理を入れて確認してみるといいですよ。

public class Sample {

    private static Value createValue(String data) {
        System.out.println("called createValue(\"" + data + "\")");
        return new Value(data);
    }

    private static Value[] values = {
        createValue("A"),
        createValue("B"),
        createValue("C"),
        null
    };

    public static void main(String[] args) {
        System.out.println("called main(String[] args)");
        System.out.println(values[1]);
        System.out.println(values[2]. data);
        System.out.println(values[3]);
    }
}

class Value {
    public String data;

    public Value(String data) {
        this.data = data;
    }

    public String toString() {
        System.out.println("called Value(\"" + data + "\").toString()");
        return this. data;
    }
}


実行結果
called createValue("A")
called createValue("B")
called createValue("C")
called main(String[] args)
called Value("B").toString()
B
C
null

2Like

Your answer might help someone💌