Vaya lío has hecho:
"No es como si en "c" haces "int * p = NULL", que sí que se crea un hueco en memoria de tipo "int *"
Si haces int p = NULL; tienes una variable de tipo int que no te vale de nada hasta que reserves el int con int p = malloc(sizeof(int)); o int p = new int; (en c++).
En C++ tienes dos opciones :
MiClase objeto;
MiClase* objeto;
La primera crea un objeto, la segunda no, por lo que la segunda necesita un:
MiClase* objeto = new Objeto();
Ahora por razones de la lógica del programa, puede que no crees el objeto hasta más tarde, vale, pero cual es la diferencia entre:
MiClase* objeto;
y
MiClase* objeto = nullptr;
Pues que si no inicalizas a null, el puntero apunta a un lugar indefinido, por ejemplo:
MiClase* objeto;
if (objeto)
{
objet->miMetodo() //Se la pega, no es null por lo que entra en el if, pero apunta vete a saber donde
}
MiClase* objeto = nullptr;
iif (objeto)
{
objet->miMetodo() //No entra en el if
}
Vale, ahora llevando esto a Java, mientras que en C++ podías hacer MiClase objeto; y MiClase* objeto, en java solo puedes hacer MiClase objeto; que equivale a MiClase* objeto; de C++, es decir, en java todo son punteros.
A diferencia de C++ donde tienes la opción de no inicializarlo a null (con el riesgo de a saber a donde apunta), en java no es necesario, las variables miembro se inicializan a null automáticamente, aunque si lo quieres poner de forma explícita no pasa nada:
class MiClase{
private MiOtraClase m_objeto;
private MiOtraClase m_objeto2 = null; //Es lo mismo
}
otro rollo son las variables dentro de un método, que no se inicializan a nada, pero a diferencia de C++ donde te dejan usarlas (aunque pete por que apunta a cuenca), en Java no puedes y tienes que explícitamente inicializarlas a null:
class MiClase{
private void miMetodo()
{
MiOtraClase objeto;
MiOtraClase objeto2 = null;
if(objeto2 != null) //Lo puedes hacer, por que objeto2 se inicializó a null
if(objeto != null) //Va a petar, por que objeto no está inicializado, de hecho creo que hasta peta en compilación
}
}