2

メイン メソッドに文字列配列以外の引数を受け入れることは可能ですか? たとえば、次のようなメソッドを使用できmain(Animals[]args){/*code*/}ますか? そうでない場合、なぜですか?

4

4 に答える 4

6

いいえ - エントリ ポイントは常にヘッダー付きのメソッドですpublic static void main(String[] args)(つまり、JVM がこの特定のメソッドを呼び出します)。あなたは確かにメソッドを定義することができます

public static void main(Animals[] args) {...}

ただし、プログラムの実行時に直接実行されることはありません。


EDIT :は、プログラムの実行時にmainこの配列にコマンドライン引数が含まれるためです。直観的に、これらは文字列であるべきです (Animalたとえば、s ではありません)。

于 2012-11-06T23:50:57.090 に答える
2

コマンドラインから入力するときは、複合型ではなく文字列を入力しているためです。

そのため、引数が文字列へのポインター (参照) の配列であることが理にかなっています。これには、(言語によって) 引数の数が含まれる場合と含まれない場合があります。Java では、 をそのまま使用できるため、これは必要ありませんlength

なぜあなたがそれをしたいのか分かりませんか?...

于 2012-11-06T23:52:43.597 に答える
1

String以外のパラメーター型をとるpublicstaticvoidmainを使用することを妨げるものは何もありません。問題は、JVMがメソッドを識別して呼び出すための単純なルールを必要とすることです。これには、プログラムに渡すために使用できる、たとえばコマンドラインからの文字列の配列があります。プログラムの実行を開始する前に、JVMはどのようにしてそれをAnimalの配列またはその他のタイプに変換しますか?

これは、異なるパラメータータイプを受け取るメインの例と、JVMが持つ文字列の配列からAnimal配列を生成するプログラム自体の例です。もちろん、2番目のメインメソッドにもっと意味のある名前を付ける方が本当に良いでしょう。

  import java.util.Arrays;

  public class Bad {

    public static void main(String[] args) {
      Animal[] animals = new Animal[args.length];
      for (int i = 0; i < args.length; i++) {
        animals[i] = new Animal(args[i]);
      }
      main(animals);
    }

    public static void main(Animal[] args) {
      System.out.println(Arrays.asList(args));
    }

  }

  class Animal {
    String species;

    public Animal(String species) {
      this.species = species;
    }

    public String toString() {
      return "Animal: " + species;
    }
  }
于 2012-11-07T00:45:23.777 に答える
1

仕様によると、文字列の配列のみを処理できます。

于 2012-11-06T23:54:07.260 に答える