2016-08-15 15 views
3
import java.util.*; 
public class Overload { 
    public static void main(String...args) { 
     System.out.println("in main 1"); 
    } 
    public static void main(String args[]) { 
     System.out.println("in main 2"); 
    } 
} 

の主な方法の両方が1を実行してしまいますが、私はそれをコンパイルするとき、それはエラーを示し、標準の署名を持っている場合、私はチェックしていました。それはどうしてそうですか?mainメソッドのオーバーロードで構文エラーが発生するのはなぜですか?

+2

[Javaプログラムには2つの主要なメソッドが存在することができますか?](http://stackoverflow.com/questions/13399836/can-there-exist-two-main-methods-in-a) -java-program)を実行します。この質問は 'メイン(文字列...引数)が' 'メイン(文字列引数[])に対し' varargs'からなること 'パラメータとして' array'から成る尋ねます。両方とも署名が異なります(コンパイル時のコンバージョンを考慮しない場合)。なぜ両方を定義できないのでしょうか。一方、質問* Javaプログラムには2つの主要なメソッドが存在することができますか?*質問に複数のエントリポイントがあるかどうかを尋ねます。どちらも違います。 –

答えて

2

省略記号(...)は、明示的に配列を宣言するのではなく、複数のカンマ区切りの引数を渡すことができます。メソッド内から、すべてのインテントと目的に対して、その引数は配列です。だから、あなたは基本的に関係なく、それは特別なmain方法だという事実を、許可されていない同じシグネチャ(public static void main(String[]))との2つのメソッドを定義しています。

0

あなたは、両方のメイン(String []型)とメイン(文字列を...)宣言することはできません。あなたのクラスは、同じSignetue(String ...)を持つ2つのメインメソッドを(String [])と同じにすることはできません。 javaでは使用できません。

2

可変引数は、基本的に単一のアレイにコンパイルされます。したがって、あなたが同じである2つの方法

あなたのコード持っている(メインの1を変更し、それが今で有効なコードです):

import java.io.PrintStream; 

public class Overload { 
    public static void main2(String... paramVarArgs) { 
    System.out.println("in main 1"); 
    } 

    public static void main(String[] paramArrayOfString) { 
    System.out.println("in main 2"); 
    } 
} 

このコードにコンパイルし、bytcodeビューアで逆コンパイル:

public class Overload { 

    public Overload() { // <init> //()V 
     L1 { 
      aload0 // reference to self 
      invokespecial java/lang/Object <init>(()V); 
      return 
     } 
    } 

    public static varargs main2(java.lang.String[] arg0) { //([Ljava/lang/String;)V 
     L1 { 
      getstatic java/lang/System.out:java.io.PrintStream 
      ldc "in main 1" (java.lang.String) 
      invokevirtual java/io/PrintStream println((Ljava/lang/String;)V); 
     } 
     L2 { 
      return 
     } 
    } 

    public static main(java.lang.String[] arg0) { //([Ljava/lang/String;)V 
     L1 { 
      getstatic java/lang/System.out:java.io.PrintStream 
      ldc "in main 2" (java.lang.String) 
      invokevirtual java/io/PrintStream println((Ljava/lang/String;)V); 
     } 
     L2 { 
      return 
     } 
    } 
} 
+0

まあ、技術的に、 'main()'と 'main2()'は**まったく異なる関数**です。 **ここで適用される**過負荷**という用語を排除しないのですか?さらに、これが解決策である場合、主な方法が過負荷にならないという結論を導くべきですか? – progyammer

関連する問題