test()
- это метод static
. static
член относится к типу и не требует экземпляра для доступа.
Элемент static
должен ONLY доступен через выражение типа. То есть вы должны были написать это следующим образом:
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
члены должны НИКОГДА не быть доступными "не-1037 *" способом, потому что это дает очень вводящее в заблуждение представление о том, что он фактически делает.
Смежные вопросы