0

次のコードで「Hi1」と「Hi3」が2回表示されるのはなぜですか?

static int a=1; 
public static void main(String[] args) {            
    if (a==2) { System.out.println(args[0]); a = 3;}
    if (a==1) { main(); }       
    System.out.println("Hi1");
    System.out.println(new PlayingWithMain().main("Hi3"));
}   
public static void main() {
    a = 2;
    String[] a = new String[10];
    a[0] = "Hi2";
    main(a);
}   
String main(String s) {
    return s;
}

OCPJP試験の準備を始めたばかりです。

4

2 に答える 2

2

この質問の最初のレッスン(または、見方によってはトリック)は、メソッドがいくつ存在mainしていても、特別なメソッドは1つだけであるということmainです。特別なものは形をとるものです

public static void main( /* multiple arguments */ ) { ... }

以前は、引数はである必要がString[] argsありましたが、最近のバージョンでは、var-argsも受け入れられます(例String... args)。 JLS 12.1.4

どのメソッドから開始するかがわかったので、最初の行で。の値がチェックされていることがわかりますa。1に初期化されているので、このa==2行は無視できます。次に、次の行で、引数なしにジャンプしますmain

no-argmainでは、aは2に設定されます。次のレッスンは、メソッドローカル変数がクラス変数を非表示にできることです。newaが宣言され、メソッド内で優先されますが、メソッドが存続する間だけ存続します。サイズが10の文字列の配列ですが、最初の文字列のみが設定されています( "Hi2"に設定されています)。このメソッドにはもう1つの教訓があります。このコードは、string-argmainが次に呼び出されると思わせるように記述されていますが、オブジェクトを作成しておらず、オブジェクトを作成していないため、呼び出されませんstatic。代わりに、に戻りmain(String[] args)ます。

今回aは2です—覚えておいてください。引数なしで設定してmainいるaのでstatic、変更はそのままです—最初の引数「Hi2」を出力します。次に、a3に設定したため、次のa==1テストは失敗します。次の行では、初めて「Hi1」を出力し、の新しいインスタンスを作成しますPlayingWithMain。これは、コードスニペット全体が存在するクラスであると想定しています。

aであるためstatic、新しいオブジェクトに対してもその値は3のままです。ただし、オブジェクトはを呼び出しているため、 ;のバージョンにmain("Hi3")は移動しません。代わりに、string-argに移動します。このメソッドは、入力を呼び出し元にキックバックし、すぐに出力されます。staticmainmain

これでstring-array-argmainが実行されるので、それを呼び出したメソッドno-argに戻りmainます。main(String[] args)また、終了したので、JVMが呼び出したバージョンに戻ります。覚えておいてください、私たちはちょうどラインを完成させました

if (a==1) { main(); }

そこで、もう一度「Hi1」の印刷に移ります。最後に、最後の行を繰り返します。これにより、別の新しいPlayingWithMainオブジェクトが作成され、最後に「Hi3」が出力されます。

于 2012-02-27T20:35:09.137 に答える
0

main(String [])はmain()を呼び出し、a == 1の場合は再びmain(String [])を呼び出します。これは、最初はtrueです。

変数は、この再帰を1回だけ発生させ、無限に発生させないようにするために使用されます。

これが、main(String [])メソッドが2回実行される理由であり、そのメソッドから書き込まれた出力が2回表示される理由です。

于 2012-02-26T15:40:20.687 に答える