test()
est static
méthode. Un static
membre appartient au type, et ne nécessitent pas une instance d'access.
Un static
membre devrait SEULEMENT être accessibles via une expression de type. C'est à dire, vous avez écrit comme suit:
Why.test(); // always invoke static method on the type it belongs to!
Java vous permet d'accéder à un static
membre par l'intermédiaire d'un objet de référence de l'expression, mais
c'est TRÈS trompeur, car ce n'est PAS le réel de la sémantique d'un static
accès membre.
Why aNull = null;
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException
Lorsque vous accédez à un static
membre par le biais d'une référence d'objet de l'expression, seul le type déclaré de la référence en la matière. Cela signifie que:
- Il n'a pas d'importance si la référence est en fait
null
, car aucune instance n'est requis
- Si la référence n'est pas
null
, il n'a pas d'importance ce que le runtime type de l'objet est, il n'y a pas de répartition dynamique!!!
Comme vous pouvez le voir, les exacts opposés sont vrai sur ces deux points, par exemple l'accès des membres. C'est pourquoi, static
membres devraient JAMAIS être accessible dans un "non-static
", parce que cela donne une apparence trompeuse sur ce qu'est réellement en train de faire.
Questions connexes