/* Cuando se invoca un método se copian los valores de 
  los argumentos en los parámetros. Ninguna actuación del 
  método sobre el parámetro puede modificar el valor original 
  de una variable que se pasa como argumento. Pero en el 
  caso de pasar una referencia a un objeto, es posible 
  modificar el objeto en sí, aunque la referencia original 
  de la variable pasada como argumento no se pueda modificar. */

public class AlumnoPasoParam {
  String nombre = null, apellidos = null, grupo = "INF-1";
  int añoDeNacimiento, númeroPersonal;
  char horario ='M';

  public static void main (String[] args) {
	 int n = 3;
	 System.out.println("n = " + n);
	 dup(n); 
	 System.out.println("Llamada a la función dup(n)."); 
	 System.out.println("n = " + n + '\n'); 

	 AlumnoPasoParam a1 = new AlumnoPasoParam();
    a1.imprime();
	 System.out.println("Llamada a la función prueba1(a1)."); 
	 prueba1(a1); // El objeto tiene dos referencias a1 y b
	              // (el parámetro del método prueba1).
	 a1.imprime();
	 
	 System.out.println(" ");
	 AlumnoPasoParam a2 = new AlumnoPasoParam();
    a2.imprime();
	 System.out.println("Llamada a la función prueba2(a2)."); 
	 prueba2(a2); 
	 a2.imprime(); 
  }  
   
  static void dup(int m) {
    m = 2*m;
  }
	 
  
  /* Si un método espera un objeto como parámetro, se obtiene 
  un nuevo alias (otra referencia) sobre el objeto. Por tanto 
  se tiene acceso al objeto y puede modificarse. */
  static void prueba1(AlumnoPasoParam b) {
    b.ponGrupo("00",'T');
  } 
  
  /* La referencia con la que se invoca el método no puede 
  modificarse. */
  static void prueba2(AlumnoPasoParam b) {
    b = new AlumnoPasoParam(); // Crea un nuevo objeto y asigna la
	                            // referencia b a este nuevo objeto.
	 b.ponGrupo("00",'T');  // Se invoca el método del nuevo objeto.
  }	 	 
	 
  String dameGrupo() {
    return grupo;
  }	 
	 	 	  
  void ponGrupo(String nuevoGrupo, char nuevoHorario) {
    grupo = nuevoGrupo;
	 horario = nuevoHorario;
  }

  void imprime() {
    System.out.println("Nombre: " + nombre);
    System.out.println("Apellidos: " + apellidos);
    System.out.println("Año de nacimiento: " + añoDeNacimiento);
    System.out.println("Número personal: " + númeroPersonal);
	 System.out.println("Grupo: " + dameGrupo());
    System.out.println("Horario: " + horario);
  }
} 