2015-06-27 15 views
5

ho inciampato attraverso un codice piuttosto strano che io sono sorpreso non causa un erroreStrano codice uscita

public class WeirdCode { 

    public static int fooField = 42; 

    public WeirdCode getFoo(){ 
     return null; 
    } 
    public static void main(String args[]) { 
     WeirdCode foo = new WeirdCode(); 
     System.out.println(foo.getFoo().fooField); 
    } 
} 

Sorprendentemente, esso stampa 42! Qualcuno può spiegare?

+2

Cosa ti aspettavi sarebbe tornato? –

+4

@ReutSharabani Ho pensato che avrebbe gettato un NullPointerException – Michael

+4

Penso che i downvoters non abbiano davvero letto il codice fino in fondo. Questa non è una brutta domanda. Ho certamente pensato che avrebbe gettato. Grazie per avermi permesso di imparare qualcosa di nuovo. +1 – sstan

risposta

13

I riferimenti ai membri statici di una classe vengono risolti in fase di compilazione. Al compilatore non importa quale sia il valore dell'espressione, solo il suo tipo, e quindi un ((WeirdCode) null).fooField si risolve a WeirdCode.fooField come qualsiasi altra cosa.

+0

Grazie, ha senso! – Michael