0

Javaは4つの値で初期化しないと思いaます。しかし、私は間違っています。これがどのように行われるか説明してもらえますか? コンストラクターで初期化していないため、コンストラクターが呼び出されたときに何をするかを意味しaます。

class A  {
    int[] a = {1,2,3,4};
    A() {
        a[0] = 3;
    }
}

class ClassTest1 {
    public static void main(String args[]) {
        A b = new A();

        System.out.println("hey " + b.a[0] );
        System.out.println("hey " + b.a[1] );
    }
}

詳細に説明し、内部を理解するための外部リソースを使用すると、初心者(私)にとってより良いものになる可能性があります。

4

1 に答える 1

4

取得するint[] a = {1,2,3,4}と、その行がコンストラクターの先頭にコンパイルされます。したがって、コンストラクターは実際には次のようになります。

a = {1,2,3,4};
a[0] = 3;

さて、これは何が起こるかを非常に単純化した定義です。複数のコンストラクターがある場合は、それらすべてに配置するように表示できますが、そのうちの 1 つだけに配置すると表示することもできます (実際に呼び出したもの...)。

このことを考慮:

class Counter {
    static int nextId = 0;
    static int nextId() { return nextId++; }

    final int id = nextId();
    final String name;

    public Counter() {
        this("Unnamed counter");
    }
    public Counter(String name) {
        this.name = name;
    }

}

したがって、名前なしでカウンターを作成するオプションがあり、デフォルトの名前だけが取得されます。上記の例から、コンストラクターが魔法のように次のようになると推測できます。

public Counter() {
    this.id = nextId();
    this("Unnamed counter");        
}
public Counter(String name) {
    this.id = nextId();
    this.name = name;
}

しかし、これが問題であることはわかっていますid。ジェネリック コンストラクターで設定しようとしますが、名前付きコンストラクターに入り、再度設定しようとします。一度設定すると、最終的な変数を設定することはできません!

代わりに、次のように考えることができます。実際に呼び出したコンストラクターは追加の初期化行を取得しますが、連鎖する可能性のあるコンストラクターは追加の行を取得しません。

于 2013-07-11T20:20:59.937 に答える