あなたの質問には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();
}
}