Saltar a contenido

🧩 Array de objetos (Java)

En Java, un array de objetos es un array de referencias.
El array guarda “flechas” (referencias) hacia objetos que viven en el heap, no los objetos dentro del array.


🗺️ Índice


✅ Idea clave: el array guarda referencias

Cuando haces:

String s;   // variable de referencia (aún NO hay objeto)
s = "Hola"; // ahora sí hay un objeto String (literal internado) y s apunta a él

Con arrays ocurre lo mismo, pero con muchas referencias:

String[] a = new String[3]; // array de 3 referencias (todas empiezan en null)
  • a apunta a un array.
  • a[0], a[1], a[2] son referencias, y al inicio valen null.
  • El objeto solo existe cuando haces new (o cuando asignas un literal/resultado que ya es un objeto).

Arrays


🧱 Declaración, creación e inicialización

🧾 Declarar (tipo + nombre)

Persona[] personas;

🏗️ Crear el array (tamaño fijo)

personas = new Persona[5];

Ojo: esto NO crea 5 personas, crea un array con 5 huecos (null).

✨ Crear objetos y meterlos dentro

personas[0] = new Persona("Ana", 20);
personas[1] = new Persona("Luis", 21);

⚡ Inicialización directa (literal de array)

String[] palabras = {"Hola", "mundo", "Java"};

Y con objetos:

Persona[] grupo = {
    new Persona("Ana", 20),
    new Persona("Luis", 21)
};

🧵 Array de String

Declaración y uso:

String[] array = new String[5];

array[0] = "Hello";
array[1] = "World";

Cada String es un objeto normal. El array solo guarda referencias a esos objetos.

Arrays


🧑‍💻 Array de objetos propios

🧩 Clase Persona

public class Persona {
    private String nombre;
    private int edad;

    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    public String getNombre() { return nombre; }
    public int getEdad() { return edad; }

    public void cumplirAnios() { edad++; }

    @Override
    public String toString() {
        return nombre + " (" + edad + ")";
    }
}

🏁 Uso en main

public class DemoArrayObjetos {
    public static void main(String[] args) {

        Persona[] clase = new Persona[3];  // [null, null, null]

        // Crear y asignar objetos
        clase[0] = new Persona("Marta", 19);
        clase[1] = new Persona("Pablo", 20);

        // clase[2] sigue siendo null

        // Recorrer con for tradicional
        for (int i = 0; i < clase.length; i++) {
            System.out.println(i + ": " + clase[i]);
        }

        // Usar un objeto (¡cuidado con null!)
        if (clase[1] != null) {
            clase[1].cumplirAnios();
        }

        System.out.println("Después: " + clase[1]);
    }
}

🧪 Recorridos y operaciones típicas

🔄 for con índice

Útil si necesitas el índice (i) o modificar posiciones.

for (int i = 0; i < personas.length; i++) {
    if (personas[i] != null) {
        System.out.println(personas[i].getNombre());
    }
}

🚶 for-each

Más simple, pero no tienes índice.

for (Persona p : personas) {
    if (p != null) System.out.println(p);
}

🔎 Buscar un elemento (por nombre)

public static Persona buscarPorNombre(Persona[] arr, String nombre) {
    for (Persona p : arr) {
        if (p != null && p.getNombre().equalsIgnoreCase(nombre)) {
            return p;
        }
    }
    return null;
}

🧹 Contar posiciones ocupadas

public static int countNoNull(Persona[] arr) {
    int c = 0;
    for (Persona p : arr) if (p != null) c++;
    return c;
}

⚠️ null y errores frecuentes

Esto peta:

Persona[] a = new Persona[2];
System.out.println(a[0].getNombre()); // a[0] es null

Solución: comprobar antes.

if (a[0] != null) {
    System.out.println(a[0].getNombre());
}

🧨 Error típico: “he creado el array, ¿por qué está vacío?”

Porque crear el array no crea los objetos.

✅ Esto crea un array vacío (de referencias):

Persona[] a = new Persona[10];

✅ Esto ya crea objetos:

for (int i = 0; i < a.length; i++) {
    a[i] = new Persona("SinNombre", 0);
}

🧠 Memoria: ¿qué ocupa realmente?

  • En un array de int, los valores están dentro del array (contiguos).
  • En un array de objetos, el array guarda referencias (punteros) a objetos.

📌 Importante: - El tamaño de la referencia depende de la JVM (a menudo 4 u 8 bytes; puede variar según configuración/arquitectura). - Los objetos viven en el heap, cada uno con su propio coste.

👉 Por eso los arrays de objetos suelen ser “ligeros” en el array… pero “pesados” en total si creas muchos objetos grandes.


🧰 Argumentos de línea de comandos (args)

El main recibe:

public static void main(String[] args) {
}
  • args es un String[].
  • Cada argumento se separa por espacios.

Ejemplo:

java Demo hola 123 adios

Entonces: - args[0] = "hola" - args[1] = "123" - args[2] = "adios"

🔢 Convertir a número

int n = Integer.parseInt(args[1]);
double x = Double.parseDouble("3.14");

🔁 Copias: referencia vs copia real

❌ Copiar una referencia (NO copia el array)

Persona[] a = new Persona[3];
Persona[] b = a; // b y a apuntan al MISMO array

✅ Copiar el array (shallow copy)

Copia las referencias, no clona los objetos.

Persona[] copia = new Persona[a.length];
for (int i = 0; i < a.length; i++) {
    copia[i] = a[i];
}

➡️ Si cambias copia[0].cumplirAnios(), también afecta al objeto que ve a[0] (porque es el mismo objeto).

✅✅ Copia profunda (deep copy)

Necesitas clonar/crear nuevos objetos (si el ejercicio lo pide):

Persona[] copia = new Persona[a.length];
for (int i = 0; i < a.length; i++) {
    if (a[i] != null) {
        Persona p = a[i];
        copia[i] = new Persona(p.getNombre(), p.getEdad());
    }
}