2013-08-12 8 views
5

私は以下のクラスを持っています。ここで署名が異なる2つの主な方法

public class Test { 

    public static void main(Integer[] args) { 
     System.out.println("This is not a main"); 
    } 

    public static void main(String[] args) { 
     System.out.println("This is the main"); 
    } 
} 

入力引数としてInteger[]String []を受け入れている2つのmain方法があります。私の質問は、JVMが常にこのクラスのmainメソッドとして2番目のメソッドをロードする方法です。なぜ常に入力引数をarrayとしてStringと考えるか?

+5

SLaksのコメントに基づいてデザインを決定します。 –

+6

これはコマンドラインの理由です。 – SLaks

+0

可能な複製http://stackoverflow.com/questions/10183611/using-int-instead-of-string-public-static-void-main-int-args – rozar

答えて

14

これはJavaが常に探しているものだからです。 Java Language Specification, Section 12.1.4

メソッドmainはpublic、static、およびvoidと宣言する必要があります。それは、その宣言された型我々は常に文字列としてコマンドライン引数を入力した文字列

5

文字列はコマンドラインに渡す文字列なので、

45

からmyprogram.exeという45

が整数でありません。 45

などの文字列です"45"のような文字列を使用して整数を表すことができます。それ以外のやり方はもう少し難しいです(ユーザは少なくとも)

+0

...整数を文字列として渡すことができるため、文字列Integerはむしろ限られています。 –

4

コマンドライン引数は常にStringsです。

+3

+1コマンドライン引数に言及しています.... –

2

の配列である仮パラメータ(§8.4.1)を指定する必要があります。 :)詳細について

0

それは文字列配列をとります。あなたが望むなら、あなたは自由にその都会に他の過負荷をかけることができます。コード内で自分自身を呼び出すことさえできます。これは、VMが特に文字列の配列をとる1つのオーバーロードを探すことです。

0

これはあなたが必要な数のオーバーロードされたmainメソッドを持つことができますが、上記の署名を持つ唯一の方法は、によって呼び出されますとしてJVMによって認識のみ署名mainメソッド

ですjvm

0

コマンドライン引数は、実行時に渡されるmain()メソッドの引数です。 JavaはStringタイプのコマンドライン引数のみを使用するため、JVMはIntegerを渡す他のmain()メソッドを無視します。

1

var-argsを使用してString配列を実装することができます。

public static void main (String ...a) 
0

、Javaのmainメソッドのシグネチャは​​であり、それはプログラムの開始時にどのようなJVMのクラスローダがロードです。 Integer引数を持つ他のmainは、mainの内部で手動で実行しない限り呼び出されません。以下に示すようにコードを修正してみてください。何も呼び出されず、あなたのプログラムは何も印刷しないことに気づくでしょう。

Btwを使用すると、任意の引数でオーバーロードされたmainメソッドを記述できます。引数がString []またはString ...でなければ、何もプログラムのローリングを開始しません。

関連する問題