2012-02-02 7 views
12

mi sono imbattuto in questo little quine program, scritto senza metodo main:programma Quine senza 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);} 
} 

Qualcuno può spiegare come funziona? Grazie.

+0

Interessante, ma come lo si lascia correre? EDIT: il file deve essere chiamato 'f.java', quindi lo si compila con' javac f.java' – mtsz

+1

Sì. Lo compili con 'javac f.java' ed eseguilo con' java f'. Funziona con jdk6, ma non con 7. –

+0

Dopo aver letto la descrizione che hai postato, l'ho eseguito, grazie comunque :) – mtsz

risposta

9

Le righe 5 e 6 sono instance initializer. Si chiama quando la classe viene istanziata. Poiché si tratta di un enum con una costante denominata f, verrà creata un'istanza una volta e il blocco di inizializzazione dell'istanza verrà eseguito.

noti che z è null, ma out è un membro statico della classe System, in modo da poter chiamare z.out.printf() comunque. L'istruzione printf prende la stringa s come stringa di formato con due argomenti, 34 e s stesso.

34 è il codice ASCII per il doppio preventivo ". È compilato per lo %c e %1$c nella stringa di formato. Lo %s nella stringa di formato viene sostituito dalla stringa di formato s stessa.