Ya hablamos sobre el hecho de que las clases son tipos de datos complejos. Ahora hablemos un poco sobre el otro lado de las clases: cómo la máquina Java maneja las clases. Recuerda que en Java todo es un objeto, incluso una clase. Una clase es un objeto. ¿Eso te sorprende? Entonces sigamos.

Cargando una clase en la memoria

En realidad, cuando se carga una clase en la memoria, se crean tres "objetos" especiales:

Cargando una clase en la memoria

Breve descripción de la ilustración:

Rectángulo amarillo:

El archivo de código se almacena en el disco como un archivo con la extensión ".class". Contiene información sobre la clase, sus campos y métodos, así como el código fuente de los métodos compilados en bytecode.

Rectángulo naranja:

Cuando la máquina Java carga una clase en la memoria, compila el código de bytes en un código de máquina específico para el procesador y el sistema operativo de la computadora. Solo la máquina Java tiene acceso a este código de máquina. Como programadores de Java, no tenemos acceso a él.

Rectángulo verde:

La máquina Java crea un objeto que contiene todas las variables y métodos estáticos de la clase. Accede a este "objeto" usando el nombre de la clase.

Por ejemplo, cuando escribe , se refiere a la variable estática ubicada en la clase. Este objeto es nuestro rectángulo verde. Y ahí es donde se almacena la variable estática.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

Rectángulo azul:

Cuando la máquina Java carga el código de una clase en la memoria, crea un java.lang.Classobjeto especial que almacena información sobre la clase cargada: su nombre, nombres de métodos, nombres y tipos de campos, etc.

El nombre "Clase" puede ser un poco confuso. Tendría más sentido llamarlo ClassInfo, ya que esta clase solo almacena información sobre la clase cargada.

Puede obtener el objeto Clase para cualquier tipo usando un comando como este:

Class name = ClassName.class;

Ejemplos:

Código Nota
Class a = String.class;
Obtener un Classobjeto con información sobre la Stringclase.
Class b = Object.class;
Obtener un Classobjeto con información sobre la Objectclase.
Class c = Integer.class;
Obtener un Classobjeto con información sobre la Integerclase.
Class d = int.class;
Obtener un Classobjeto con información sobre el inttipo.
Class e = void.class;
Obtener un Classobjeto con información sobre el voidtipo.

También puede obtener una referencia a un objeto de descripción de clase desde cualquier objeto, ya que cada objeto tiene el getClass()método, que hereda de la Objectclase.

Ejemplos:

Código Nota
Class a = "Hello".getClass();
Mismo objeto queString.class
Class b = new Integer().getClass();
Mismo objeto queInteger.class
Class c = Boolean.TRUE.getClass();
Mismo objeto queBoolean.class