Каким образом вызов a (статический) метод на нулевой ссылке не бросает NullPointerException?

Я записал эту программу в 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, и все же вышеупомянутая программа не делает? Почему это? Разве я не понимаю что-то правильно?

49
задан polygenelubricants 23 July 2010 в 04:50
поделиться

4 ответа

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, то не имеет значения тип объекта во время выполнения, нет динамической диспетчеризации!!!

Как видите, для доступа к членам экземпляра в обоих случаях справедливы прямо противоположные утверждения. Вот почему статические члены не должны НИКОГДА быть доступны "нестатическим" способом, потому что это дает очень обманчивое представление о том, что они на самом деле делают.

Похожие вопросы

80
ответ дан 7 November 2019 в 11:43
поделиться

Статическим методам не нужна ссылка на объект. Таким образом, вы можете назвать это, даже если ссылка на объект равна нулю. Так работает основной метод.

Попробуйте удалить статическое обозначение с объекта, чтобы увидеть исключение нулевого указателя.

3
ответ дан 7 November 2019 в 11:43
поделиться

Это статический метод, который позволяет вам вызывать для него методы без создания экземпляра.

3
ответ дан 7 November 2019 в 11:43
поделиться

Вам следует включить различные предупреждения в вашей IDE. Скорее всего, вы увидите предупреждение о доступе к статическому члену нестатическим способом.

Вы можете сделать что-то вроде (Why)(null).test(), это только использует (Why)(null) для получения класса.

3
ответ дан 7 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: