2

以下のコードyから、静的変数bの値が初期化されておらず、コンストラクターで値が初期化されていることを理解したいと思います。

public class A {
       private static B b = null;
       public A() {
           if (b == null)
             b = new B();
       }

       public static void main(String[] args) {
           b.func();
       }
    }

ありがとうプニート

4

4 に答える 4

7

間違っています-次のようにしてください:

public class A {
       private static B b = null;

       static {
             b = new B();
       }

       public A() {
       }

       public static void main(String[] args) {
           b.func();
       }
    }
于 2012-05-09T13:34:24.287 に答える
6

A()コンストラクターを呼び出すことはありません。main関数は静的です。つまり、Aのインスタンスに「属していません」。したがって、mainに入ると、Aのインスタンスは作成されていないため、コンストラクターは呼び出されず、bはnullのままです。

このコードを実行すると、NullPointerExceptionが発生するはずです。

新しいA();を追加した場合 b.func();の前 その後、あなたは大丈夫になります(コードはまだ奇妙です)

于 2012-05-09T13:36:32.913 に答える
3

あなたの質問には2つの部分があると思います。

1)静的変数bの値が初期化されなかったのに、コンストラクターで値が初期化されたのはなぜですか?

回答:まず、main()の前にコンストラクターが呼び出されないことです。コンストラクターはmain()で呼び出されます。main()で使用するときはいつでもnew

public static void main(String args[]){
MyClass myclass= new MyClass()
}

次に、コンストラクターのみが呼び出されます。

コードでは、静的変数bは初期化されていません。コンストラクターA()で初期化されているためですが、このコンストラクターは呼び出されていません。コード内でA()コンストラクターを次のように呼び出すことができます。

public static void main(String[] args) {
          A a=new A(); // constructor gets called here.
           b.func();
       }

2)静的変数を初期化する適切な方法は何ですか?

静的変数を初期化する正しい方法は、上記のduffymoの回答に示されているように、コンストラクターで静的初期化ブロックを初期化するのではなく、静的初期化ブロックを使用することです。

static {
  b = new B();
 }

次のものも使用できます。

public class A {
       private static B b = new B();

       public A() {
       }

       public static void main(String[] args) {
           b.func();
       }
    }
于 2012-11-30T07:30:13.203 に答える
2

あなたの質問は、あなたがその行動がそのままであった「理由を理解する」のを助けるように頼まれました。その理由は、静的メソッドを呼び出すときにクラスAのコンストラクターが呼び出されないためですmain()

タイプのオブジェクトをインスタンス化する場合はA、コンストラクターが呼び出され、初期化されたものを参照しBます。

良い習慣として、クラスを実行する前に、常にクラスをインスタンス化することをお勧めしますstatic void main()。フレームワーク(Springなど)の使用を開始する場合は、手続き型コードの記述に似た静的メソッドを記述するよりも、クラスのインスタンスを作成する方が適切です。

静的イニシャライザーに頼らず、ここでの原則の概要に従わない解決策は...

public class A {
    private static B b = null;

    public A() {
        if (b == null)
          b = new B();
    }

    public static void main(String[] args) {
        A a = new A();
        a.callFunc();
    }

    public void callFunc() {
        b.func();
    }
}

ご覧のとおり、参照する方法が必要なので、この理由でb.func() methodを追加しましたa.callFunc()

于 2012-05-09T13:48:47.047 に答える