メインメソッドなしで書かれたこの小さなクワインプログラムに出くわしました:
enum f {
f;
System z;
String s="enum f{f;System z;String s=%c%s%1$c;{z.out.printf(s,34,s);z.exit(0);}}";
{z.out.printf(s,34,s);
z.exit(0);}
}
誰かがこれがどのように機能するか説明できますか? ありがとう。
メインメソッドなしで書かれたこの小さなクワインプログラムに出くわしました:
enum f {
f;
System z;
String s="enum f{f;System z;String s=%c%s%1$c;{z.out.printf(s,34,s);z.exit(0);}}";
{z.out.printf(s,34,s);
z.exit(0);}
}
誰かがこれがどのように機能するか説明できますか? ありがとう。
5 行目と 6 行目はインスタンスの初期化子です。クラスがインスタンス化されるときに呼び出されます。これは という名前の 1 つの定数を持つ列挙型であるためf
、一度インスタンス化され、インスタンス初期化ブロックが実行されます。
ですが、クラスの静的メンバーであるため、とにかく呼び出すことz
ができます。このステートメントは、文字列を 2 つの引数を持つフォーマット文字列として受け取り、それ自体を受け取ります。null
out
System
z.out.printf()
printf
s
34
s
34
二重引用符の ASCII コードです"
。フォーマット文字列の%c
andに入力されます。%1$c
フォーマット文字列の%s
は、フォーマット文字列s
自体に置き換えられます。