1. Los Dos Niveles de Memoria en el Heap
En Java, un array de objetos NO guarda los objetos adentro de sus casillas. El array es un objeto contenedor en el Heap cuyas celdas contienen únicamente PUNTEROS a otras instancias repartidas en la memoria.
Persona[] plantel = new Persona[3];
plantel[0] = new Persona("Messi", 10);
plantel[1] = new Persona("Di María", 11);
plantel[2] = new Persona("Dibu", 23); 2. La Creación en Dos Pasos y la Trampa del null
Hacer new Persona[3] NO crea 3 personas. Crea un mueble con 3 cajones vacíos inicializados en null. Invocar un método sobre una casilla antes de instanciarla produce el temido NullPointerException.
// PASO 1: Contenedor (3 casillas en null)
Persona[] lista = new Persona[3];
// PASO 2: Instanciar cada elemento
lista[0] = new Persona("Lautaro", 22);
System.out.println(lista[0].getNombre()); // OK! 3. Recorrer con Seguridad: El Filtro Contra Nulos
En la práctica real los arrays raramente están llenos al 100%. Todo bucle for o for-each debe incluir una compuerta de seguridad `if (elem != null)` para procesar únicamente elementos vivos y descartar casillas vacías.
for (Persona p : plantel) {
if (p != null) { // <-- Blindaje obligatorio
p.presentarse();
}
} 4. Capacidad Física vs Cantidad Lógica
Un array reservado de tamaño 6 puede tener solo 3 elementos activos. Una variable contadora `cantidad` rastrea el próximo índice libre. Cuando se llena (`cantidad == capacidad`), se redimensiona copiando a un nuevo array más grande.
public void agregar(Persona p) {
if (cantidad == plantel.length) {
plantel = Arrays.copyOf(plantel, plantel.length * 2);
}
plantel[cantidad] = p;
cantidad++;
} 5. Ordenar Arrays de Objetos: Escribir el Criterio a Mano
Arrays.sort() ordena solo un array de primitivos. Con objetos no sabe qué comparar: hay que escribir el bucle de comparación a mano, campo por campo. El ordenamiento intercambia punteros en el array sin duplicar objetos en el Heap — vas a automatizar este criterio en la lección 16.
// Ascendente: buscás el menor y lo llevás al frente
if (plantel[j].getCamiseta() < plantel[menor].getCamiseta()) {
menor = j;
}
// Descendente: mismo bucle, comparación invertida
if (plantel[j].getCamiseta() > plantel[mayor].getCamiseta()) {
mayor = j;
}