この質問の最初のレッスン(または、見方によってはトリック)は、メソッドがいくつ存在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」が出力されます。