Javaのメインメソッドが静的なのはなぜですか? 質問する

Javaのメインメソッドが静的なのはなぜですか? 質問する

Java メソッドのメソッド シグネチャは次のとおりmainです。

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

このメソッドが静的でなければならない理由はありますか?

ベストアンサー1

これは単なる慣例です。実際、main() という名前や渡される引数も、純粋に慣例です。

Java 21が導入されました代替条約プレビュー機能として、String[]パラメータ、public修飾子、さらにはstatic修飾子を省略できます。修飾子を省略するとstatic、呼び出し前にクラスのインスタンスが作成され、クラスに非プライベートのゼロパラメータ コンストラクターが必要になります。コンストラクターが宣言されていない場合は、コンパイラによって作成される既定のコンストラクターで十分です。

java.exe (または Windows では javaw.exe) を実行すると、実際に行われているのは、Java Native Interface (JNI) 呼び出しの 2 組です。これらの呼び出しは、実際には JVM である DLL をロードします (そうです、java.exe は JVM ではありません)。JNI は、仮想マシンの世界と C、C++ などの世界を橋渡しする必要がある場合に使用するツールです。逆もまた真なりで、JNI を使用せずに JVM を実際に実行することは (少なくとも私の知る限り) 不可能です。

基本的に、java.exe は、コマンド ラインを解析し、それらの引数を保持するために JVM に新しい文字列配列を作成し、main() を含むように指定したクラス名を解析し、JNI 呼び出しを使用して main() メソッド自体を検索し、main() メソッドを呼び出して、新しく作成された文字列配列をパラメーターとして渡す、非常にシンプルな C アプリケーションです。これは、Java からリフレクションを使用するときに行うことと非常によく似ています。代わりに、紛らわしい名前のネイティブ関数呼び出しを使用するだけです。

java.exe の独自のバージョン (ソースは JDK とともに配布されます) を作成し、まったく異なる動作を行わせることはまったく問題ありません。実際、Java ベースのすべてのアプリでまさにそれを行っています。

当社の Java アプリにはそれぞれ独自のランチャーがあります。主に独自のアイコンとプロセス名を取得するためにこれを行いますが、通常の main() 呼び出し以外の操作を行って作業を開始したい場合にも便利です (たとえば、COM 相互運用性を実現しているケースでは、文字列配列ではなく COM ハンドルを main() に渡します)。

つまり、長い話と短い話です。これが静的である理由は、それが便利だからです。これが「main」と呼ばれる理由は、それが何かである必要があったからです。main() は、C の昔の時代に行われていたものです (そして、その時代は関数の名前重要でした)。java.exe では、クラス (java com.mycompany.Foo.someSpecialMain) だけでなく、完全修飾された main メソッド名を指定できたと思いますが、そうすると、IDE でプロジェクト内の「起動可能な」クラスを自動検出するのが難しくなります。

おすすめ記事