Посмотрите внимательно, print()
является статическим методом. Это означает, что он может быть вызван без экземпляра Test1
. То есть это просто можно назвать:
Test.print();
Тот факт, что метод test()
возвращает нуль не имеет значения. На самом деле, если вы используете современную среду IDE, у вас, вероятно, будет предупреждение о вашем вызове test().print()
, предупреждающее вас о том, что вы пытаетесь вызвать статический метод для экземпляра объекта.
Не существует исключения NullPointerException, поскольку JVM не пытается почтить объект, возвращаемый тестом(). JVM знает, что ему не нужно вызывать статический метод для экземпляра объекта.
Если вы хотите узнать больше об основной реализации и разнице между invokespecial
и invokestatic
Я бы предложил this question.
Это имеет смысл, если вы действительно думаете об этом. – arshajii
почему, как вы думаете, это не так? – vandale
Хотя это должно скомпрометировать, это блестящий пример ужасной читаемости кода :) – JamoBox