public static void main(String arg[])
最近、試験でメソッドの形式main
が修正されたかどうか尋ねられました。変更できますか?、、を使わmain
ずpublic
に使用できますstatic
かvoid
?そうでない場合、常に 意味main(String arg[])
するハードコーディングされていないのはなぜですか?public static void main(String arg[])
9 に答える
main メソッドの署名は、Java 言語仕様のセクション 12.1.4で指定されており、次のように明確に述べられています。
メソッド main は public、static、および void として宣言する必要があります。宣言された型が String の配列である仮パラメーター (§8.4.1) を指定する必要があります。
- そうでなければ、
public
それを呼び出すことはできません static
オブジェクトを呼び出す前にオブジェクトをインスタンス化する方法がないため、これに違いありません- 引数のリストは
String
、コマンド ラインから Java プログラムを実行するときにパラメーターを渡すことができるようにするためにあります。引数なしで定義することもできたでしょうが、その方がより実用的です (そして他の言語と同様です)。 - 戻り値の型は
void
、それ以外のものを持つ意味がないためです。Java プログラムは、メイン メソッドの最後に到達する前に (たとえば、 を呼び出すことによってSystem.exit()
)終了できます。
したがって、メソッド シグネチャは次のようになります。
public static void main( String[] args )
public static void main( String... args )
varargsバージョン ( ...
) は Java 5 以降でのみ有効であることに注意してください。
Java 言語では、括弧[]
を型または変数の後に配置できるため (一般的には最初の方が好まれます)、
public static void main( String args[] ) // valid but usually non recommended
も有効です
JDKソースコード(jdk-src \ j2se \ src \ share \ bin \ java.c)を調べる場合:
/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
"([Ljava/lang/String;)V");
...
{ /* Make sure the main method is public */
...
mods = (*env)->CallIntMethod(env, obj, mid);
if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
message = "Main method not public.";
messageDest = JNI_TRUE;
goto leave;
...
この署名だけが必要であることが非常に明確になります。
main メソッドはpublic
、クラスがロードされたときに JVM によって検出されるようにする必要があります。同様にstatic
、クラスのインスタンスを作成せずに、クラスをロードした後に呼び出すことができるようにする必要があります。すべてのメソッドには戻り値の型が必要です。この場合はvoid.
メソッドの引数については答えられませんが、jvm は関数にアクセスできる必要があり、jvm はクラスのインスタンスを作成する方法を知らないため静的でなければならないため、パブリックにする必要があります。
この投稿では、静的の理由について詳細な回答が得られます: Why is the Java main method static?
この投稿は、main が void である理由について適切な回答を提供します: Why is main() in Java void?
アプリ用の新しいローダーを作成する場合は、これを変更できます。public static void main(String args [])形式は、JVMで作業している人々がJavaプログラムを呼び出すために見つけたデフォルトのソリューションであるため、それを行う明確な方法があります。
今日の実際の実装では、JNIインターフェイスを使用して、この関数を使用してpublic static void main(String args [])メソッドを呼び出すだけなので、JNIを使用して別のメソッドを使用する場合は、まったく同じコードを簡単に記述できます。アプリをロードします。
これが現在のLinuxランチャープログラムです。メソッドルックアップはここから始まります。
public-main() メソッドは、クラスの外部とクラスの内部のいずれかで使用する必要があるため、そのパブリック
クラスを定義する場合、そのクラスのオブジェクトを定義する場合、およびそのクラスを使用できる場合のみ..しかし、これの代わりに、静的という単語を直接使用して使用します
void-for main() は int や char のような値を返すことはできません main()-main は、Java の将来にアクセスするために使用できる関数またはメソッドです。