2015-06-27 4 views
5

Я наткнулся на некоторые довольно странный код, что я удивлен не вызывает ошибкуСтранный код Выход

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

Удивительно, но он печатает 42! Может ли кто-нибудь объяснить?

+2

Что вы ожидали от этого? –

+4

@ReutSharabani Я думал, что это вызовет исключение NullPointerException – Michael

+4

Я думаю, что downvoters действительно не читали код до конца. Это не плохой вопрос. Я, конечно, думал, что это собирается бросить. Спасибо, что позволили мне узнать что-то новое. +1 – sstan

ответ

13

Ссылки на статические члены класса разрешаются во время компиляции. Компилятору все равно, каково значение выражения, просто его тип, и поэтому ((WeirdCode) null).fooField просто решает до WeirdCode.fooField, как и все остальное.

+0

Спасибо, имеет смысл! – Michael