java - restricción - Es una instancia de una clase creada automáticamente cuando llama por primera vez a un método estático
restricción de java al usar atributos y métodos estáticos. (3)
Me gustaría saber si tiene una clase con solo métodos estáticos, ¿se crea una instancia real de la clase en algún lugar cuando llama al primer método estático?
Esto es algo confuso de entender en términos de administración de memoria, ya que nunca llama al constructor o crea una instancia del método explícitamente.
Si se crea una instancia, me gustaría entender mejor dónde vive esta instancia y por cuánto tiempo.
Di que tienes
static class Foo
{
static Bar bar = new Bar();
static int func(){ ... }
}
obviamente, no se creará un objeto Foo
para llamar a func()
.
Sin embargo, la clase Foo
necesita ser cargada en la memoria; y para la aplicación, hay un objeto correspondiente a la clase, que puede denominarse Foo.class
, o Class.forName("Foo")
.
Una clase cargada no está inicializada todavía. Cuando se llama a un método estático por primera vez, la clase se inicializa; se asigna algo de "espacio" para las variables estáticas, y se ejecuta el código de inicialización estático (como el new Bar()
).
Este "espacio" no es visible para la aplicación como un objeto; pero también es una estructura de datos en memoria que concierne a las recolecciones de basura (y otros objetos a los que hace referencia, como la bar
)
La clase y el "espacio" solo son elegibles para GC cuando el cargador de clases que cargó la clase es elegible para GC. Para las aplicaciones de línea de comandos habituales, eso nunca sucede. Pero para muchas otras aplicaciones, la clase GC es importante, y la carga de clases debe hacerse con cuidado.
No. Llamar a un método static
no requiere (o crea) una instancia de una class
. Vea también static
métodos static
JLS-8.4.3.2 que dicen (en parte)
Un método que se declara
static
se denomina método de clase.
...
Un método de clase siempre se invoca sin hacer referencia a un objeto en particular.
static
métodos static
pertenecen a la clase, no a la referencia del objeto. Puede llamar al método static
y olvidarse de perder memoria al crear una referencia de objeto de la clase que se está utilizando, eso no sucede. Cuando llama a un método static
en una referencia de objeto, recibe una advertencia del compilador sobre el tema. Incluso puede llamar a métodos static
en una variable de la clase deseada y esta variable puede ser null
, el método static
se invocará sin problemas.
public class Foo {
public static void sayHello(String name) {
System.out.println("Hello " + name);
}
}
//works, no instance of Foo was created
Foo.sayHello("AlexVPerl");
Foo foo = new Foo();
//works, compiler raises a warning here
foo.sayHello("AlexVPerl");
foo = null;
//works, compiler raises a warning here
//and as you can see, it doesn''t matter if the instance is null
foo.sayHello("AlexVPerl");