Ответ 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
", потому что это дает очень вводящий в заблуждение внешний вид того, что он на самом деле делает.
Связанные вопросы
- Почему Java не позволяет переопределять статические методы? (понимание
this
имеет решающее значение!) - Почему не вызывает статический метод путем экземпляра ошибки для компилятора Java?