test()
is a static
method. A static
member belongs to the type, and do not require an instance to access.
A static
member should ONLY be accessed via a type expression. That is, you should've written it as follows:
Why.test(); // always invoke static method on the type it belongs to!
Java does allow you to access a static
member via an object reference expression, but
this is VERY misleading, since this is NOT the actual semantics of a static
member access.
Why aNull = null;
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException
When accessing a static
member through an object reference expression, only the declared type of the reference matters. This means that:
- It doesn't matter if the reference is actually
null
, since no instance is required
- If the reference is not
null
, it doesn't matter what the runtime type of the object is, there is no dynamic dispatch!!!
As you can see, the exact opposites are true on both points for instance member access. This is why static
members should NEVER be accessed in a "non-static
" way, because it gives a very misleading appearance on what it's actually doing.
Related questions
NULL
to always benull
, in which case you'll probably want to learn aboutfinal
keyword and what it means for fields vs local variables (and classes and methods). – BrewhouseWhy[] w = new Why[2]; w[3].test();
there will be an ArrayIndexOutOfBoundsException – LancasterWhy NULL = null;
– Endopeptidase