public class MyClass{
static{
System.out.println("Weired Behaviour");
}
}
//Java MyClass を使用してコマンド ラインから呼び出された場合 (何とその理由) が出力されますか?
出力は次のようになります。
Weired Behaviour
Exception in thread "main" java.lang.NoSuchMethodError: main
実際にはウィアードではありません。以下は、JVM で発生する一連のアクティビティです。
アプリケーションを呼び出そうとすると、メイン クラスがロードされます。クラスの静的ブロックは、JVM がクラスをロードするときに実行されます。静的ブロックは一種のクラス初期化子であり、クラスがメモリにロードされたときにのみ呼び出されます。
クラスがロードされると、JVM はエントリ ポイントであるメイン メソッドを見つけようとします。main メソッドが見つからないため、例外がスローされます。
Static Initalizer は、JVM がクラスをロードするとき、クラスのインスタンスが作成される前、さらに静的メソッドまたは変数が初期化される前に実行されるブロックです。
これにより、「Weired Behaviour」というステートメントが出力されますが、 「メイン」メソッドで
あるエントリ ポイントを見つけようとすると、例外がスローされます。Exception in thread "main"
あなたが実際にこのようなものを持っていると仮定して、あなたに怒鳴らないようにします:
public class MyClass{
static{
System.out.println("Weird Behavior");
}
public static void main(String[] args){}
}
出力として次のように表示されます。
Weird Behavior
これは、JVM がクラスをロードするときにクラス内の静的ブロックが実行されるためです。