4

重複の可能性:
Java でメイン メソッドをオーバーロードできますか?

次のコードをコンパイルして実行しようとすると、機能し、コンソールに「A」が表示されます。

なんで?

私の考えでは(String... args)は同じ(String arg, String[] args)です。

public class AFewMainExample {
    public static void main(String... args) {
        System.out.print("A");
    }

    public static void main(String args) {
        System.out.print("B");
    }

    public static void main(String[] args, String arg) {
        System.out.print("C");
    }

    public static void main(String arg, String[] args) {
        System.out.print("D");
    }
}
4

4 に答える 4

2

これは実際には JLS の§12.1.4で指定されています。

メソッドは、、、および とmain宣言する必要があります。宣言された型が の配列である仮パラメータ ( §8.4.1 ) を指定する必要があります。したがって、次の宣言のいずれかが受け入れられます。publicstaticvoidString

  • public static void main(String[] args)

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

hereに記載されているように、関数が呼び出される方法を除いて、varargs 型と標準配列型の間に違いはありません。したがって、varargs バージョンは上記のすべての基準を満たし、有効なmainメソッドとして合格します。明らかに、他のすべてのmainオーバーロードは同等ではありません (そうでない場合、コンパイル エラーが発生します)。

于 2013-01-07T21:33:59.233 に答える
1

最初の署名は、void main (String[] args) に一致する唯一のものです。

fn(String... args) と fn(String[] args) の違い

于 2013-01-07T21:28:32.830 に答える
0

パラメーター (順序 (または) タイプ (または) 両方) はメイン メソッドごとに異なります。これにより、実際のメイン構文を持つメイン メソッドは 1 つだけになるため、問題はありません。

次のメイン メソッドを追加すると、正確な構文を持つ 2 つのメソッドが存在するため、コンパイル時エラーが表示されます。

public static void main(String[] args) {
    System.out.print("A");
}

オーバーロードの詳細については、このチュートリアルをお読みください。

于 2013-01-07T21:27:20.747 に答える
0

主な問題は次のとおりです。

+ signature of main(String... args) is different for
    - main(String[] args, String arg)
    - main(String arg, String[] args)

+ main(String... args) 
    - not equals for main(String[] args, String[] args2)
    - only for main(String[] args)

ただし、次の例ではコンパイル エラーが発生します。

public class MainOverloadingExample4 {

void go(String s){
    System.out.println("void go(String s)");
}
void go(String ... s){
    System.out.println("void go(String ... s)");
}   
void go(String s, String ... arr){
    System.out.println("void go(String s, String ... arr){");
}   
public static void main(String[] args) {
    new MainOverloadingExample4().go("where I am?", "why I am here?");
}
}

メソッド go(String[]) は型 MainOverloadingExample に対してあいまいです

于 2013-01-07T22:25:56.023 に答える