2012-02-02 29 views
12

Tôi đã xem qua little quine program này, được viết mà không cần phương pháp chính:chương trình Quine mà không main()

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);} 
} 

ai đó có thể giải thích như thế nào công việc này? Cảm ơn.

+0

Thú vị, nhưng làm cách nào để nó chạy? EDIT: Tệp phải được đặt tên là 'f.java', vì vậy bạn biên dịch nó bằng' javac f.java' – mtsz

+1

Có. Bạn biên dịch nó bằng 'javac f.java' và chạy nó với' java f'. Nó hoạt động với jdk6, nhưng không phải với 7. –

+0

Sau khi tôi đã đọc mô tả bạn đã đăng, tôi đã chạy nó, tuy nhiên :) – mtsz

Trả lời

9

Dòng 5 và 6 là instance initializer. Nó được gọi khi lớp được khởi tạo. Vì đây là một enum với một hằng số có tên là f, nó sẽ được khởi tạo một lần và khối khởi tạo thể hiện được thực thi.

Lưu ý rằng znull, nhưng out là thành viên tĩnh của lớp System, vì vậy bạn có thể gọi z.out.printf() anyway. Câu lệnh printf lấy chuỗi s làm chuỗi định dạng với hai đối số, 34s chính nó.

34 là mã ASCII cho báo giá kép ". Nó được điền vào cho %c%1$c trong chuỗi định dạng. Các %s trong chuỗi định dạng được thay thế bằng chuỗi định dạng s chính nó.

Các vấn đề liên quan