Javaのmainクラスのstatic
解決したいこと
Javaのmainクラスのstaticについて。staticは
インスタンスを作成しなくても、
他のクラスで、使用できる意味だと思います。
しかし、これは他のクラスで使用しないのに、
なんで、mainクラスにstaticをつけるんでしょうか??
わかりやすく、解説していただければ、ありがたいです。
発生している問題・エラー
public static void main(String[] args) {
Javaのmainクラスのstaticについて。staticは
インスタンスを作成しなくても、
他のクラスで、使用できる意味だと思います。
しかし、これは他のクラスで使用しないのに、
なんで、mainクラスにstaticをつけるんでしょうか??
わかりやすく、解説していただければ、ありがたいです。
public static void main(String[] args) {
mainメソッドは、javaコマンドのここから呼び出されています。
そのときにインスタンスを作成せずに呼ばれているんですよ。
だからstaticなんです。
main
のようなメソッドはエントリポイントと呼ばれます
エントリポイントはOSによってプログラムの外から呼ばれるメソッドです
プログラムの外でJavaを実行する場合、エントリポイントがどのクラスに属しているかを意識することはありません
Javaにおいてもstatic
メンバを呼び出す際に、そのメンバがどのインスタンスに属しているかを意識することはありませんし、必要もありません
何故所属インスタンスを意識する必要がないかといえば、static
メソッドにはthis
引数がないためです
インスタンスメソッドが変数から呼び出せるのは、変数がこの暗黙的な引数this
に代入されるためです
Javaの文脈では変数.メソッド()
という構文で変数をthis
に渡せますが、プログラムの外は当然Javaの世界ではないので、同じ宣言が使えません
this
は剥き出しの引数として認識され、Javaを実行する処理系がエントリポイントの属するインスタンスを自力で探さねばなりません
ですがJavaがまだ実行されていない状態ではインスタンスも存在しません
となるとプログラムを実行する手段がありません
ですが、static
が付いていればthis
引数が無いことを保障できるので、処理系もインスタンスを探す手間が省けます
余談ながら、これは予め所定のインスタンスを作っておき、それを必ず認識させるようにすればstatic
は必要ないということでもあります
実際Javaはプレビュー機能によって限定的な文脈においてstatic
を外すことを認めています
プレビュー機能についてはJava23
のリリースページをご覧ください