8
class NewClass{
public static void main(String a){
    System.out.print("Hello");
}
}

上記のコードを実行しようとすると、エラーが表示され、mainメソッドが見つかりません。しかし、私がまたはに変更public static void main(String a)したとき。その後、動作します.. !!public static void main(String... a)public static void main(String a[])

だから、私の質問は、合法的なメインメソッドシグネチャを書くことができるいくつかの異なる方法と、このシグネチャが何をpublic static void main(String... a)意味するのかということです。

4

8 に答える 8

14

それがJavaの要件だからです。

プログラムへのメインのメソッド/エントリポイントは、として宣言されたメソッドである必要public static void main(String[] args)があります。パラメータを使用して宣言されたメソッドStringは類似していますが、互換性がありません。

配列は単一の文字列と同じではありません。誰かが3つのコマンドラインパラメータを使用してJavaを呼び出した場合、JVMは3要素の文字列配列を作成し、これを単一の文字列のみを受け取るメソッドにどのように渡しますか?

したがって、その場合、エントリポイントとして機能するメインメソッドを持たないクラスに基づいてJavaプログラムを起動しようとしていました。

(これが機能する理由String...は、これが配列パラメーターの構文糖衣であり、同じシグニチャーを持つメソッドにコンパイルされるためです。)

于 2012-11-28T11:00:56.577 に答える
4

最後に、 Sun Certified Programmer for Java 6 bookで私の質問の答えを見つけました。

最初の質問は、main メソッドを使用する合法的な方法はいくつありましたか?

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

public static void main(String a[])
public static void main(String[] a)
public static void main(String... a)

とはどういう(String... a)意味ですか??

パラメータを使用してメソッドを宣言するには、スペースを使用してから、受け取ったパラメータを保持する配列の名前var-argsを続ける必要があります。ellipsis(...)したがって、変数引数として知られる上記の用語は、 0 to manyを意味します。

また、可変引数パラメーターの使用規則は、メソッド シグネチャの最後のパラメーターである必要があり、1 つのメソッドに var-args を 1 つだけ持つことができます

例えば:

void myfunc(String... a)              //legal
void myfunc(String a...)              //illegal
void myfunc(String a,int... b)         //legal
void myfunc(String... a,int b)        //illegal 
于 2012-12-13T08:54:26.167 に答える
3

Javaでのデフォルト。Javaコンパイラは、コマンドライン引数の配列を想定しています。そのため、stringargs[]またはString..を指定する必要があります。

于 2012-11-28T11:00:47.967 に答える
2

これらはすべて、Java の main 関数の有効/合法的な宣言です。

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

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

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

public static void main(String[] MarkElliotZuckerberg) {
    // code
}

public static void main(String... NewYork) {
    // code
}

覚えておくべきポイントは -

  • キーワード public と static は交換可能ですが、必須です。
  • main メソッドのパラメーターは、var-args 構文を取ることができます。
  • 名前はなんでもいいです..!

練習のために.. :P ...これらは無効なメインメソッド宣言の例です -

static void main(String[] args) {
    // public is missing
}

public void main(String args[]) {
    // static is missing
}

public static int main(String... Java) {
    // return type not void

    return 0;
}

public void Main(String args[]) {
    // "main" not "Main"
}

public void main(string args[]) {
    // "String" not "string"
}

public void main(String.. SayHi) {
    // Ellipses is 3 dots !
}

エラーが発生するものもあれば、単に main メソッドをオーバーロードするものもあります...これが役に立てば幸いです...! もしそうなら、コメントで教えてください..!

ソース -プログラミング理論に関する Java チュートリアル

于 2015-06-03T19:12:14.767 に答える
1

public static void main(String a[])は、一般的なJavaプログラムの主要なエントリポイント署名です。したがって、このメソッドシグネチャを使用する必要があります。

于 2012-11-28T11:00:13.833 に答える
1

Java ランタイムは、名前が「main」で、引数の型が「String[]」のメソッドを見つけようとします。これは、型引数が String[] のメソッドを見つけるためにリフレクションを使用するようなものです。

また、指定されたプログラム引数またはコマンド ライン引数をランタイムが渡すことができるように、String[] も使用されます。これは、ランタイムが引数を空白文字でトークン化し、「main」という名前のこのメソッドを呼び出すようなものです。

メソッド main は public、static、および void として宣言する必要があります。文字列の配列である単一の引数を受け入れる必要があります。このメソッドは、次のいずれかとして宣言できます。

public static void main(String[] args)
or

public static void main(String... args)

さらに理解を深めるために、Oracle Java 仕様のドキュメントを参照することもできます。

第 12 章実行 - セクション 12.1.4 Test.main の呼び出し

于 2012-11-28T11:21:47.403 に答える
0

正確にパラメータが必要ですString[] args(これは配列です)。

その理由は、指定されmain()たシグニチャを使用してメソッドを宣言する必要があるためです(そして、メソッドシグニチャには、その名前、パラメータの数、およびパラメータのタイプが含まれています)。

したがって、異なるパラメータタイプ(文字列と文字列配列)の関数を作成すると、それは認識されません。

于 2012-11-28T10:59:18.510 に答える