2011-01-23 8 views
1

私はその外観が狂っていることを知っています。しかし、とにかく。私たちはすべて、メインメソッドの方法を知っています: public static void main(String args[])。その理由は、"main"(java)の必要性

  • publicある:この方法は、それが定義されているクラスの外部コード(JVMから起動)
  • staticからアクセスすることができる。この方法は、それが宣言されたクラスをインスタンス化することなくアクセスすることができます。 また、このキーワードを使用すると、JVMはクラスをインスタンス化せずにこのメソッドを呼び出すことができます。
  • void:このメソッドはデータを返しません。

ここで「メイン」の必要性は何ですか? public static void entry(String args[])という別のメソッドがあっても、なぜjvmがこのメソッドを呼び出さないのでしょうか。それは、それが主要な方法を見つけることができないと言っているコンパイラの問題を与える。このpublic static void entry(String args[])でも、上記の3つのルールがコンパイルされます。

+5

仕様が「メイン」である必要がありますので、あまりにも悪いです。 – BoltClock

+5

JVMは 'entry'メソッドを呼び出さなければならないことをどのように知っていますか?変数nameを作成する場合、呼び出すメソッドのどこかを指定する必要があります。 –

+0

"これは、' main'メソッドを見つけることができないというコンパイラの問題を示しています。 "あなたはそれがあたかも悪いものであるかのように言います。 –

答えて

3

JNI呼び出しインタフェースを使用して独自のコマンドラインドライバを実装し、どんなエントリポイントでもプログラムを起動できます。

'main'の特殊文字は、純粋にJavaコマンドラインプログラムの質問です。デザイナーが選択しました。その理由はあまり興味深いものではありません。変更されることはありません。まあ、正確に言えば、あなたはopenjdkプロジェクトに参加し、それらに機能を売ろうとすることができます。

+0

FWIW - JNIを使​​って独自のランチャーを書くのはかなりシンプルですが、私は良い練習としてそれをお勧めしたいと思います。古い方法でアプリをデプロイする場合は、独自の実行可能ファイルを用意することも良いことです。 –

1

他の理由から離れて、技術的ではないが、おそらく技術的な考慮事項よりも重要なものが1つあります。 - Javaを簡単に(C++プログラマーにとっては)覚えやすくします。 Javaが始まったときに、作成者は簡単な言語にして、開発者が既存の言語から変換するのを助けたいと考えていました。その時点で使用されている主要なOO言語はC++であったため、エントリポイントはmainとなりました(実際には@FelixはCから継承してできるだけ後方互換性を持たせるために継承されていました) Javaの名前も。それ以来、同じ理由で、C#も同様の規約を採用しています(ただし、やや一般的な形です)。

+1

そして 'C++'は 'C'からそれを手に入れました。そして、「C」はそれを得ました....私は知らない。 –

+1

そしてCはBCPLから得て、BCPLはBrian KerninghanとDennis Ritchieからそれを得ました。 –

+0

BCPLはstart()を使用していませんか? – Rekin

2

このメソッドは、メソッドがエントリポイントメソッドであることを指定する必要があるため、mainと呼びます。 1つのString[]引数を持つpublic static voidメソッドだけでなく、エントリポイントと見なす必要があります。何か違う方法をしたいかもしれません。また、メソッドが持たなければならない特定の名前を指定することによって、単一のクラスが最大で1つのエントリポイントメソッドを持つことができるという保証があります。

このクラスを実行しようとすると、いくつかのルールがないかぎり、使用する方法はどのように決まりますか?今日の注釈では、public static voidメソッドをString[]のargに@EntryPointなどで注釈を付ける必要があるかもしれませんが、mainソリューションは、コンパイラがクラスごとに1つのmainメソッドの制限を強制することができるため、これよりも優れていますその通常のメソッドのシグネチャのルール、複数のメソッドに同じアノテーションを与えることができます。注釈が追加されるずっと前にプログラムを実行する方法とCとC++の先例が必要であったという事実は言うまでもありません。

関連する問題