Почему при вызове (статического) метода в нулевой ссылке не выбрасывается исключение NullPointerException?

Я написал эту программу в Java

public class Why {

  public static void test() {
    System.out.println("Passed");
  }

  public static void main(String[] args) {
    Why NULL = null;
    NULL.test();
  }

}

Я прочитал, что вызов метода для объекта null вызывает NullPointerException, и все же указанная выше программа не работает? Почему это? Я что-то не понимаю правильно?

Ответ 1

test() - это метод static. A static принадлежит к типу и не требует доступа к экземпляру.

A static член должен ТОЛЬКО получать доступ через выражение типа. То есть вы должны были записать его следующим образом:

Why.test(); // always invoke static method on the type it belongs to!

Java позволяет вам получить доступ к элементу static через выражение ссылки объекта, но это ОЧЕНЬ вводит в заблуждение, так как это НЕ истинная семантика доступа члена static.

Why aNull = null; 
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException

При доступе к элементу static через выражение ссылки объекта используется только заявленный тип ссылки. Это означает, что:

  • Не имеет значения, действительно ли ссылка null, поскольку экземпляр не требуется
  • Если ссылка не null, не имеет значения, какой тип времени выполнения объекта отсутствует, динамическая отправка отсутствует.

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

Связанные вопросы

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Статическая переменная и методы связаны с классом, а не с каким-либо объектом. Каждый экземпляр класса использует переменную класса, которая находится в одном фиксированном месте в памяти.

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