Hola
El nombre de la variable/objeto que ponemos entre parentesis, puede ser un nombre cualquiera. No tiene porque coincidir con el nombre del atributo/variable/objeto perteneciente a otra clase.
Es un nombre que tú eliges en el momento de escribir el código de ese método, y dicho nombre solo afecta al código que hay dentro de ese método, no tienen nada que ver con como se llame ese objeto/variable en otras partes del código.
Ese nombre que ponemos entre parentesis, es algo así como un "alias".
Cuando decimos...
public void setMatricula (String valorMatricula)
...lo que estamos diciendo es que este método ha de recibir un objeto de tipo String, el cuál no tenemos ni idea de como se llama en la parte del código donde se haya creado originalmente..., pero dentro de este método lo vamos a llamar "valorMatricula" y ese será el nombre que usaremos para operar con él, repito, dentro de este método.
Por eso el código compila y funciona exactamente igual con cualquiera de estas declaraciones:
public void setMatricula (String valorMatricula)
public void setMatricula (String a)
public void setMatricula (String tururu)
Repito, no importa como se llame ese objeto en otras partes del código, tú le pones un nombre esocgido por tí, un "alias", y con ese nombre operas con él dentro de ese método.
ESto no es solo ventajoso, sino necesario... ya que lo habitual en realidad es que un programador escriba métodos que vayan a ser usados en decenas de programas distintos.
Sería absurdo, y costoso, si para cada programa concreto hubiera que reescribir el método para adecuar los nombres de las variables/objetos ha dicho programa.
Es más, un método es habitual que, dentro de un mismo programa, reciba objetos del mismo tipo pero con distintos nombres
Por ejemplo, imágina un método que reciba objetos de una clase llamada Circulo y calcule el area..
public double calcularArea(Circulo c)
Este sería un método que se puede usar en distintos programas y que además en un mismo programa puede estar recibiendo objetos Circulo con distintos nombres:
Circulo c1;
Circulo c2;
Circulo c3;
.....
Circulo c10;
...
Imagina que tenemos 10 objetos circulos, o 100, o 10000....¿debería escribir 10000 métodos cada uno con el nombre del objeto Circulo correspondiente entre parentesis?
Sería demencial..
Lo escribo una sola vez, le pongo el nombre que a mi me de la gana, ya sea "c", ya sea "circulin"....
y me vale para cualquier objeto Circulo, se llame como se llame,...porque no me importa como se llame, solo me importa el "alias" que yo le he puesto dentro de mi método.
**************
Sobre tu segunda pregunta..
Y por que no se iguala con el parametro como veniamos haciendolo??
Creo que te refieres a por qué no usamos el operador "=" en esta linea.
public void setMatricula (String valorMatricula) { vehiculoTaxi.setMatricula(valorMatricula); }
Y si no es a esto a lo que te refieres, igualmente lo explico un poco por si a alguien le puede servir.
El objeto vehiculoTaxi, al ser de la clase Taxi, tiene un atributo matricula declarado así:
private String matricula;Al estar declarado como private, cuando estamos escribiendo código "dentro" de su clase, sí podemos acceder directamente a su atributo y usar el operador de asignacion "=".
matricula = valorMatricula;
Pero en este caso, estamos escribiendo código "fuera" de su clase, pues estamos codificando la clase TaxiCond.
Esto significa que no podemos acceder directamente al atributo matricula del objeto vehiculoTaxi.
La única forma de acceder a este atributo, es mediante su set (vehiculoTaxi.setMatricula(String)) para modificarlo y mediante su get ((vehiculoTaxi.getMatricula()) para recuperar su valor.
Si en vez de private, hubieramos declarado el atributo matricula como public:
public String matricula;entonce si podríamos acceder directamente a este atributo desde cualquier otra clase y utilizar el operador de asignacion "=". Sería así:
vehiculoTaxi.matricula = valorMatricula;
Si quisiéramos, podríamos hacerlo así... pero no es buen apráctica hacer esto.
Lo recomendable, lo ideal, es declarar los atributos como private y acceder a ellos mediante sus setters y getters.
La intención de esto es proteger y controlar el acceso a los atributos y además permite dotar de más funcionalidades.
En estos ejercicios, son código sencillos para ir aprendiendo y a veces no se percibe todo el potencial.
Pero por ejemplo, imagina que nosotros queremos controlar que solo entren matriculas que sean válidas, es decir que tengan un formato concreto.
Por ejemplo la matricula 1234-BFN sería valida según el formato europeo, pero la matricula 12-B-34-FN no sería válida para un vehiculo en Europa.
Entonces, en nuestro método setMatricula(String valorMatricula), podemos añadir todo el código que creamos necesario para comprobar que el String que hay dentro de valorMatricula tiene un formato válido.
Si lo tiene, entonces lo aceptamos y se lo asignamos al atributo matricula de nuestro objeto Taxi.
Pero si no lo tiene, entonces lo podemos rechazar y lanzar un mensaje al usuario advirtiendo que la matricula introducida, no es válida y no ha sido aceptada.
Esto no podríamos hacerlo mediante una simple asignación con "=", así que declarar el atributo como public es abrir la puerta a que luego otro programador no haga un validación de datos correcta antes de aceptarlos.
Declarando como private y obligando a utilizar nuestros setters, los cuáles si hemos incluido código para validar la "calidad" de los datos recibidos, evitamos que otro programador pueda aceptar datos no válidos.
Cuando se avance en programación, habrá ciertas situaciones donde no nos convenga declarar un atributo como private y tengamos que "relajar" la restricción declarandolo como "protected" o tal vez incluso como "public".
Pero será en casos muy concretos. La "norma" es declararlos siempre como private, y luego si se presenta la necesidad, pues subir el nivel de acceso, si no queda más remedio.