usar restricción que métodos metodos metodo instancia estáticos estatico ejemplos definicion datos clases clase atributos java instance static-methods

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");