24

mainJava宣言の構文について質問があります。

public static void main (String[] args)

main関数を呼び出すときに可変数の文字列を渡すことができるので、これは配列ではなく可変長の引数リストではないでしょうか。文字列パラメータのリストを使用したこのメソッドのコマンドライン呼び出しが機能するのはなぜですか?(文字列のリストを使用して配列を作成し、その配列をmainメソッドに渡す舞台裏の処理がない限り...?)メイン宣言はこのようなものではありません...?-

public static void main(String... args) 
4

8 に答える 8

41

main(String... args)事実上main (String[] args)同じものです。取得しているのはString配列です。varargsは、呼び出し元の単なる構文糖衣です。

main()コードから呼び出すことは決してないので、varargsが導入されたときに後付けされていなかったと思います。

編集:実際には、その最後の文をスクラッチします。main(String... args)もちろん、完全に有効な構文です。2つのスタイルは完全に交換可能です。これは問題なく機能します。

public class Test {

    public static void main(String... args) {
        System.out.println("Hello World");
    }

}
于 2010-02-04T17:20:37.253 に答える
16

mainはどちらの方法でも宣言でき、問題なく機能します。「下位互換性」や「後付け」の問題はありません。ただし、コードの読者は気が散る可能性があり、プログラムを改善する可能性はほとんどありません。

Java言語仕様(第3版)のセクション8.4.1には、「最後の仮パラメーターがタイプTの可変アリティパラメーターである場合、タイプT[]の仮パラメーターを定義すると見なされます」と記載されています。

Javaプログラムの起動方法の仕様は、VM仕様の第5章を参照しているJLS12.2にあります。VM仕様のセクション5.2には、VMがパブリッククラスメソッド""を呼び出すと記載されていますvoid main(String[])。VM仕様には可変アリティの概念がないため、「...」を使用して宣言されたメインは要件を満たします。

于 2010-02-04T17:47:13.260 に答える
9

mainメソッドはJava1.0用に設計されました。

「...」構文はJava1.5で導入されました

定義したタイプの配列を介して実装されます(私の推測ですが、Java 1.4バイトコードと1.5バイトコードに互換性がある場合は、配列を使用して実装する必要があります)。

于 2010-02-04T17:21:18.403 に答える
6

Javaのメインメソッドはありません。実際、メインメソッドで配列をvarargとして宣言できます

public static void main(String... args) { System.out.println("Hi!"); }
于 2010-02-04T17:27:34.050 に答える
1

javaのメイン構文は、java1.5でのみ導入されたvarargsよりも前のものです。

于 2010-02-04T17:21:20.217 に答える
1

メインの宣言はもっとこのようなものにすべきではありません...?

public static void main(String... args) 

実際、それは問題なく行うことができました。

String [] argsvar argsが導入される前でしたが、現在は両方とも機能します。

于 2010-02-04T17:41:29.170 に答える
0

ええと、2番目の構文は1番目のバリエーションにすぎません。そうです、それは素晴らしいことですが、現時点ではJavaに組み込まれていません。

于 2010-02-04T17:21:22.037 に答える
-2

なんで気にするの?mainメソッドを手動で呼び出す人は誰もいません。これはJavaの内部です。

編集:メインメソッドを次のように定義できるので、今は問題ではないと思います:

public static void main(String... args);

誰も明示的にmainを呼び出さないので、私のポイントはまだ有効です。

于 2010-02-04T17:23:28.090 に答える