Я записал эту программу в Java
public class Why {
public static void test() {
System.out.println("Passed");
}
public static void main(String[] args) {
Why NULL = null;
NULL.test();
}
}
Я считал что, вызвав метод на a null
объектные причины NullPointerException
, и все же вышеупомянутая программа не делает? Почему это? Разве я не понимаю что-то правильно?
test()
является статическим
методом. Член static
принадлежит типу и не требует доступа к экземпляру.
К члену static
следует ТОЛЬКО обращаться через выражение типа. То есть, вы должны были написать так:
Why.test(); // always invoke static method on the type it belongs to!
Java позволяет получить доступ к статическому
члену через выражение ссылки на объект, но
это ОЧЕНЬ вводит в заблуждение, поскольку это НЕ фактическая семантика доступа к статическому
члену.
Why aNull = null;
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException
При доступе к статическому
члену через выражение объектной ссылки имеет значение только объявленный тип ссылки. Это означает, что:
null
, поскольку экземпляр не требуетсяnull
, то не имеет значения тип объекта во время выполнения, нет динамической диспетчеризации!!! Как видите, для доступа к членам экземпляра в обоих случаях справедливы прямо противоположные утверждения. Вот почему статические
члены не должны НИКОГДА быть доступны "нестатическим
" способом, потому что это дает очень обманчивое представление о том, что они на самом деле делают.
Статическим методам не нужна ссылка на объект. Таким образом, вы можете назвать это, даже если ссылка на объект равна нулю. Так работает основной метод.
Попробуйте удалить статическое обозначение с объекта, чтобы увидеть исключение нулевого указателя.
Это статический метод, который позволяет вам вызывать для него методы без создания экземпляра.
Вам следует включить различные предупреждения в вашей IDE. Скорее всего, вы увидите предупреждение о доступе к статическому члену нестатическим способом.
Вы можете сделать что-то вроде (Why)(null).test(), это только использует (Why)(null) для получения класса.