static
los miembros ( static
campos o static
métodos) en Java están asociados con su clase respectiva en lugar de los objetos de esta clase. El siguiente código intenta acceder a un campo estático en una null
referencia.
public class Main
{
private static final int value = 10;
public Main getNull()
{
return null;
}
public static void main(String[] args)
{
Main main=new Main();
System.out.println("value = "+main.getNull().value);
}
}
Aunque main.getNull()
vuelve null
, funciona y se muestra value = 10
. ¿Cómo funciona este código?
Main main = null; main.getNull().value
.new Thread[]{}[-1].sleep(10);
dónde sleep () es un método estático. Esto solía tener éxito en algunas versiones anteriores de Java.Respuestas:
Ese comportamiento se especifica en la Especificación del lenguaje Java :
En más detalles, una evaluación de campo estática , como
Primary.staticField
funciona de la siguiente manera (énfasis mío), en su casoPrimary = main.getNull()
,:fuente
Porque, como dijiste, los campos estáticos no están asociados con una instancia.
La capacidad de acceder a campos estáticos desde una referencia de instancia (como lo está haciendo) es simplemente un azúcar sintáctico y no tiene ningún significado adicional.
Tu código se compila a
fuente
Siempre que accede a una variable o método estático con objetos en el momento de la compilación, se convierte al nombre de clase. p.ej:
Imprimirá el valor del valor de la variable estática porque en el momento de la compilación se convertirá a
Prueba:
descargue el decompilador y descompile su archivo .class en un archivo .java y podrá ver que todos los métodos estáticos o el nombre del objeto referido a la variable se reemplaza automáticamente por el nombre de la clase.
fuente
Acceder a un
static
miembro con el nombre de la clase es legal, pero no se escribió que no se puede acceder alstatic
miembro utilizando la variable de referencia del objeto. Entonces funciona aquí.A una
null
variable de referencia de objeto se le permite acceder a unastatic
variable de clase sin lanzar una excepción en tiempo de compilación o ejecución.fuente
La variable estática y el método siempre pertenecen a la clase. Entonces, cuando creamos cualquier objeto, solo la variable no estática y los métodos se acumulan junto con el objeto, pero la estática reside en el área de método con la clase. Es por eso que cada vez que intentamos acceder a una variable o método estático, se convierte en el nombre de la clase, la variable de punto o el nombre del método.
Consulte el enlace a continuación para obtener más detalles.
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
fuente