この質問の最初のレッスン(または、見方によってはトリック)は、メソッドがいくつ存在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」を出力します。次に、a
3に設定したため、次のa==1
テストは失敗します。次の行では、初めて「Hi1」を出力し、の新しいインスタンスを作成しますPlayingWithMain
。これは、コードスニペット全体が存在するクラスであると想定しています。
a
であるためstatic
、新しいオブジェクトに対してもその値は3のままです。ただし、オブジェクトはを呼び出しているため、 ;のバージョンにmain("Hi3")
は移動しません。代わりに、string-argに移動します。このメソッドは、入力を呼び出し元にキックバックし、すぐに出力されます。static
main
main
これでstring-array-argmain
が実行されるので、それを呼び出したメソッドno-argに戻りmain
ます。main(String[] args)
また、終了したので、JVMが呼び出したバージョンに戻ります。覚えておいてください、私たちはちょうどラインを完成させました
if (a==1) { main(); }
そこで、もう一度「Hi1」の印刷に移ります。最後に、最後の行を繰り返します。これにより、別の新しいPlayingWithMain
オブジェクトが作成され、最後に「Hi3」が出力されます。