
// Tipi di dato complessi

public class Esempio18 {

	static void aggiungiPrefisso(Persona p) {
		// Nota: anche se il riferimento p viene passato per valore,
		// se modifico p.telefono questo cambia la memoria, e quindi
		// ha un effetto sull'array rubrica usato sotto. 
		p.telefono = "0039-" + p.telefono;
		// Questo comando invece cambia il riferimento, non la memoria
		// e quindi è irrilevante. Dopo che la procedura termina,
		// non ne rimarrà traccia
		p = new Persona("Urca!", "555-999");
	}
	
	static void stampaRubrica(Persona[] r, int numPersone) {
		int i;
		System.out.println("=============================");
		for (i=0 ; i<numPersone ; i++) {
			Persona p = r[i];
			System.out.println("Nome: " + p.nome + "   Telefono: " + p.telefono);
		}
	}
	
	
	public static void main(String[] args) {
		
		// Un altro modo di rappresentare l'informazione: uso un array di Persona
		// dove Persona è un tipo che definisco a parte nel file "Persona.java"
		
		int persone = 10;  // numero di persone
		Persona[] rubrica; // i miei dati
		// Alloco memoria
		rubrica = new Persona[persone];
		// Inizializzo
		rubrica[0] = new Persona("Mario",     "555-231"); // alloco e inizializzo
		rubrica[1] = new Persona("Giuseppe",  "555-232");
		rubrica[2] = new Persona("Asdrubale", "555-624");
		// ... eccetera
		
		int i;
		for (i=0 ; i<3 ; i++) {
			aggiungiPrefisso(rubrica[i]);
		}
		stampaRubrica(rubrica, 3);

		// Aggiungiamo ancora una persona, "due volte":
		rubrica[3] = new Persona("Ultimo", "555-172");
		rubrica[4] = rubrica[3];
		// Si noti che non ho allocato memoria per due Persona ma solo per una!
		// Il codice sopra è concettualmente errato perché usa lo stesso riferimento
		// (e quindi la stessa memoria) per due informazioni scorrelate!
		// Se ora faccio:
		aggiungiPrefisso(rubrica[3]);
		aggiungiPrefisso(rubrica[4]);
		// Questo mi ha aggiunto il prefisso DUE volte sull'unica Persona che ho allocato!
		// È equivalente a:
		//    aggiungiPrefisso(rubrica[3]);
		//    aggiungiPrefisso(rubrica[3]);
		// visto che rubrica[4] ha lo stesso riferimento di rubrica[3].
		stampaRubrica(rubrica, 5);
		// Questo ora stampa
		//    ...
		//    Nome: Ultimo   Telefono: 0039-0039-555-172
		//    Nome: Ultimo   Telefono: 0039-0039-555-172
	}

}
