2

次のコードにはコンパイラの問題があると予想していましたが、驚くべきことにそうではありませんでした。

class p {
  static int a = 10;

  public static void main(String...args) {
    System.out.println(a);
  }
}

class child extends p {
  public static void main(String[] args) {
    System.out.println(p.a+10);
  }
}

誰でも教えてもらえますか:

main()a) コンパイラが複数のメソッドについて文句を言わないのはなぜですか?

main()b) コマンド ラインから上記のプログラムを実行すると、クラス p のメソッドだけが実行されていることがわかりますか? その背後にある理論的根拠は何ですか?

4

3 に答える 3

5

mainメソッドは、複数のクラスで同じ名前と署名を持つことができるという点で、Java の他のメソッドと同じです。

Java で何かを実行するには、main実行する正しいメソッドを含むクラスを指定する必要があるため、特別です。

p実行するクラスを指定する必要があります。

$ java p
10

child実行するクラスを指定することもできます。

$ java child
20

クラスをコンパイルするchildと、次の警告が表示されます。

Child.java:3: 警告: Child の main(java.lang.String[]) は P の main(java.lang.String...) をオーバーライドできません。オーバーライド メソッドがありません '...'

staticしかし、メソッドが継承されないことはすでにわかっています。大丈夫です、とにかくここで継承しようとしているわけではありません。

また、とにかくにString...解決されるため、署名は同等です。String[]

于 2013-09-06T00:54:31.290 に答える
1

a) なぜコンパイラはそれについて不平を言うのですか? メソッドは 2 つの異なるクラスで定義されていますが、これは Java では完全に合法です (ただし、スーパー クラスとサブ クラスで同じフィールド名を共通にすることはお勧めできません)。

b) 実行しているクラスによって異なります。pクラスを実行している必要があります。

于 2013-09-06T00:56:10.930 に答える
1

main メソッドは、プログラムのエントリ ポイントとして機能します。複数のクラスで複数のメイン メソッドを宣言することで、複数のエントリ ポイントを宣言するだけで、Java ではそれについて何の問題もありません。

結局、コマンド ライン経由でプログラムを実行するときは、どのクラスをエントリ ポイントとして使用するかを指定する必要があります。ソースファイルの名前が であると仮定するとp.java、次のようにプログラムを実行します。

java p

p の main メソッドが呼び出されますが、プログラムを次のように実行した場合:

java child

childクラスのメインメソッドが代わりに実行されますp

于 2013-09-06T00:57:07.453 に答える