次の4つの main メソッド宣言のうち、JVM がプログラムのエントリーポイントとして正しく認識できるものをすべて選べ(それぞれ独立したクラスに書かれているものとする)。
A public static void main(String[] args) { }
B static public void main(String[] args) { }
C public void main(String[] args) { }
D public static void main(String args) { }
- A
public static void main(String[] args) { } - B
static public void main(String[] args) { } - C
public void main(String[] args) { } - D
public static void main(String args) { }
正解・解説・誤答理由・ひっかけを見る▼ open
解説
public・static・戻り値 void・引数が String[](または可変長引数 String...)という条件をすべて満たすメソッドでなければならない。
- A:条件をすべて満たす標準形。適格。
- B:修飾子
publicとstaticの記述順序は自由(static publicでもpublic staticと同じ意味)。適格。 - C:
staticが無い。JVM はインスタンス生成無しにクラスから直接呼び出すため、staticは必須。不適格(コンパイルは通るが、実行時に「main メソッドが static でない」旨のエラーになる)。 - D:引数が配列でない単一の
String。エントリーポイントの条件を満たさない。不適格。
よって適格なのは A・B。
- C
staticが欠けている。JVM はインスタンスを作らずクラスから直接呼び出すためstaticは必須で、これが無いとエントリーポイントとして認識されない。 - D引数が
String[](配列)やString...(可変長引数)ではなく単一のString。シグネチャが一致しないためエントリーポイントとして認識されない。
public static と static public は意味的に同一で両方適格。逆に「コンパイルが通る=実行できる」も誤り。C・D はコンパイル自体は通ってもJVMのエントリーポイント要件(static・配列引数)を満たさないため java クラス名 で直接実行できない。A・B:javac 通過・java コマンドで正常起動。 C:javac 通過だが「main メソッドが static でない」旨の実行時エラー(Error: Main method is not static in class クラス名, please define the main method as:)。 D:javac 通過だが「main メソッドが見つからない」旨の実行時エラー(Error: Main method not found in class クラス名, please define the main method as:)=シグネチャが一致しないため。