¿Cómo es que invocar un método (estático) en una referencia nula no arroja NullPointerException?

Escribí este progtwig en Java

public class Why { public static void test() { System.out.println("Passed"); } public static void main(String[] args) { Why NULL = null; NULL.test(); } } 

Leí que invocar un método en un objeto null causa NullPointerException y, sin embargo, el progtwig anterior no? ¿Por qué es esto? ¿No estoy entendiendo algo correctamente?

test() es un método static . Un miembro static pertenece al tipo y no requiere una instancia para acceder.

Se debe acceder ÚNICAMENTE a un miembro static a través de una expresión de tipo. Es decir, deberías haberlo escrito de la siguiente manera:

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

Java le permite acceder a un miembro static través de una expresión de referencia de objeto, pero esto es MUY engañoso, ya que NO es la semántica real de un acceso de miembro static .

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

Al acceder a un miembro static través de una expresión de referencia de objeto, solo importa el tipo declarado de la referencia. Esto significa que:

  • No importa si la referencia es realmente null , ya que no se requiere ninguna instancia
  • Si la referencia no es null , no importa cuál sea el tipo de tiempo de ejecución del objeto, ¡¡ no hay despacho dynamic !!!

Como puede ver, los opuestos exactos son ciertos en ambos puntos, por ejemplo, el acceso de los miembros. Esta es la razón por static cual NUNCA debe accederse a los miembros static una manera “no static “, ya que da una apariencia muy engañosa sobre lo que realmente está haciendo.

Preguntas relacionadas

  • ¿Por qué Java no permite la anulación de métodos estáticos? (¡Entender que this es crucial!)
  • ¿Por qué no se está llamando a un método estático a través de una instancia un error para el comstackdor de Java?

Los métodos estáticos no necesitan una referencia al objeto. Entonces, puede llamarlo, incluso la referencia al objeto es nulo. Así es como funciona el método principal.

Intente eliminar la designación estática del objeto para ver la excepción del puntero nulo.

Es un método estático, que le permite invocar métodos sin una instancia de instancia.

Debes activar las diferentes advertencias en tu IDE. Lo más probable es que vea una advertencia sobre el acceso a un miembro estático de una manera no estática.

Podría hacer algo como (Por qué) (nulo) .test (), solo está usando el (Por qué) (nulo) para obtener la clase.

La variable estática y los métodos están asociados con la clase, en lugar de con cualquier objeto. Cada instancia de la clase comparte una variable de clase, que está en una ubicación fija en la memoria.

Cualquier objeto puede cambiar el valor de una variable de clase, pero las variables de clase también se pueden manipular sin crear una instancia de la clase y lo mismo se aplica al Método estático. para más refiérete esto .