No se puede declarar instancias de clases usando el nombre de la clase y un nombre para el objeto (como se hace en C++). La declaración
crea solamente una referencia a un objeto de dicho tipo. Para crear un objeto dinámico en el montón se usa el operador new con el constructor del objeto deseado. El operador devuelve una referencia al objeto creado.
Sólo si una clase no contiene ningún constructor Java propone un constructor por defecto que tiene el mismo modificador de acceso que la clase. Constructores pueden lanzar excepciones como cualquier otro método.
Para facilitar la construcción de objetos aún más, es posible usar bloques de código sin que pertenezcan a constructores. Esos bloques están prepuestos (en su orden de aparencia) delante de los códigos de todos los constructores.
El mismo mecanismo se puede usar para inicializar miembros estáticos poniendo un static delante del bloque de código. Inicializaciones estáticas no pueden lanzar excepciones.
class ... {
...
static int[] powertwo=new int[10];
static {
powertwo[0]=1;
for(int i=1; i<powertwo.length; i++)
powertwo[i]=powertwo[i-1]<<1;
}
...
}
Si una clase, p.ej., X, construye un miembro estático de otra clase, p.ej., Y, y al revés, el bloque de inicialización de X está ejecutado solamente hasta la aparencia de Y cuyos bloques de inicialización recurren al X construido a medias. Nota que todas las variables en Java siempre están en cero si todavía no están inicializadas explícitamente.
No existe un operador para eliminar objetos del montón, eso es tarea del recolector de memoria incorporado en Java (diferencia con C++ donde se tiene que liberar memoria con delete explícitamente).
Para dar pistas de ayuda al recolector se puede asignar null a una referencia indicando al recolector que no se va a referenciar dicho objeto nunca jamás.
Las referencias que todavía no acceden a ningún objeto tienen el valor null.
Está permitida la conversión explícita de un tipo a otro mediante el ``cast'' con todas sus posibles consecuencias.
El ``cast'' es importante especialmente en su variante del ``downcast'', es decir, cuando se sabe que algún objeto es de cierto tipo derivado pero se tiene solamente una referencia a una de sus super-clases.
Se puede comprobar el tipo actual de una referencia con el operador instanceof.