4

次のコードを検討してください。

class MyClass {
    private static MyClass myobj = new MyClass();

    private MyClass() {
    }

    public  static MyClass getMyobj() {
        return myobj;
    }
}

1)上記のコードで、いつmyobj初期化されるかMyclass、ロードされるか、またはいつgetMyobj()最初に呼び出されるMyClass.getMyobj();か?

2) 次のように 2 回呼び出すとします。

MyClass.getMyobj();
MyClass.getMyobj();

2回目の呼び出しで新しいMyClass()オブジェクトを作成しますか?

4

6 に答える 6

2
  1. クラスがいつロードされるか

  2. いいえ、別のオブジェクトは作成されません。既存のオブジェクトが使用されます

于 2012-07-13T16:56:32.817 に答える
1

指摘されているように、オブジェクトはクラスが初期化されるときに作成されます。メソッドは単純にそれを返すため、サンプル コードではそのようなインスタンスは作成されません。

ただし、そのようなことをしたい場合はenum、単一のインスタンスで を作成することもできます:

public enum MyClass {
   myobj;
}

次に、コード自体がシングルトンの動作を保持している間、操作する必要があるコードmyobjはフィールドに簡単にアクセスできます。MyClass.myobjもちろん、public static finalフィールドでも同様の効果が得られます。

列挙型には、誤って任意のオブジェクトを作成したくないことをコンパイラが認識できるという利点があります。代わりに遅延初期化が必要な場合は、遅延ロードされた部分に追加のデリゲートを導入する必要があるという欠点があります。

于 2012-07-13T17:06:56.307 に答える
1

1)上記のコードで、いつ myobj が初期化されますか

クラスが最初にロードされたとき。

2) 次のように 2 回呼び出すとします:...2 回目の呼び出しで新しい MyClass() オブジェクトを作成しますか?

いいえ、主にmyobj静的であるためgetMyobj()、ロード時に作成された同じインスタンスが常に返されます。

于 2012-07-13T16:56:38.517 に答える
1
  1. MyClass がロードされたとき。

  2. 10 回呼び出しても、MyClass のインスタンスは 1 つしか存在しません。

于 2012-07-13T16:56:58.250 に答える
0

MyClass がロードされるとすぐに初期化されます。しかし、初期化されるのは 1 回だけです。

于 2012-07-13T16:58:34.190 に答える
0

クラスがロードされるとすぐに初期化されると言うのは正しくありません。クラスが初期化されるのは、実行中のプログラムが ( new キーワードを使用してそのコンストラクターを呼び出すことにより) そのクラスのインスタンスを作成するか、クラスに属する静的メソッドまたはフィールドのいずれかが使用される場合のみです。

初期化に関する JVM 規則については、 Java 言語仕様のセクション 12.4.1を参照してください。

私がこれを知っているのは、Joshua Bloch による優れた本「Effective Java, Second Edition」のおかげであることを指摘しておく必要があります。項目 71 は、遅延初期化と「遅延初期化ホルダー クラスのイディオム」に関するアドバイスを提供します。

したがって、あなたの質問に答えて、実行中のプログラム(メソッドなど)が実際に呼び出しを行ったMyClass.myobjときにのみ初期化され、その前の瞬間ではありません。main()MyClass.getMyobj()

また、静的フィールドはクラスごとに 1 回だけ初期化されるため、次回MyClass.getMyobj()呼び出されると、単純に の既存の値が返されるためMyClass.myobj、まったく同じ MyClass オブジェクトへの 2 つの参照が取得されます。

于 2012-07-14T12:32:35.930 に答える