2013-11-29 7 views
3

Ребята Я недавно увидел какой-то фрагмент кода и не знаю, почему он работает?Почему этот код работает?

public class Test1{ 

    static Test1 test(){ 
     System.out.println("test"); 
     return null; 
    } 

    static void print(){ 
     System.out.println("print"); 
    } 

    public static void main(String...strings){ 
     test().print(); 
    } 

} 
+0

Это имеет смысл, если вы действительно думаете об этом. – arshajii

+0

почему, как вы думаете, это не так? – vandale

+2

Хотя это должно скомпрометировать, это блестящий пример ужасной читаемости кода :) – JamoBox

ответ

2

Посмотрите внимательно, print() является статическим методом. Это означает, что он может быть вызван без экземпляра Test1. То есть это просто можно назвать:

Test.print(); 

Тот факт, что метод test() возвращает нуль не имеет значения. На самом деле, если вы используете современную среду IDE, у вас, вероятно, будет предупреждение о вашем вызове test().print(), предупреждающее вас о том, что вы пытаетесь вызвать статический метод для экземпляра объекта.

Не существует исключения NullPointerException, поскольку JVM не пытается почтить объект, возвращаемый тестом(). JVM знает, что ему не нужно вызывать статический метод для экземпляра объекта.

Если вы хотите узнать больше об основной реализации и разнице между invokespecial и invokestatic Я бы предложил this question.

+1

Я знаю это, но не могли бы вы дать более подробное объяснение? Почему мы не получаем NPE? –

+1

@ KirillSolokhov JVM просто знает, что не нужно разыменовывать объект, когда это статический метод. – jwa

+0

@ Kirill предположил, что это не null, что бы сделал компилятор? Используйте объявленный класс и вызовите статический метод. Говорить с фактическим примером - пустая трата времени, так что это не беспокоит. В результате этого JVM даже не знает, что она равна нулю –

Смежные вопросы