Autor Tema: Explicación didáctica entender código Java que usa conceptos avanzados CU00641B  (Leído 2312 veces)

Edwin

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Hola!! Tengo una duda que quisiera aclarar con referencia al tema CU00641B antes mencionado y quisiera que por favor me ayudaran y me explicaran para continuar con el curso sin dudas.

En el ejemplo de clases que utilizan objetos el metodo setter de la clase taxicond es decir

Código: [Seleccionar]
public void setMatricula (String valorMatricula) { vehiculoTaxi.setMatricula(valorMatricula); }

En el Codigo del metodo, lo que esta dentro del parentesis se supone que hace referencia al valor en el metodo de la clase taxi ? entonces por que si se cambia el (valormatricula) por cualquier texto y se iguala con el parametro requerido esto no afecta en nada y se realiza el compilado sin ningun problema... es decir en vez de escribir el codigo tal como esta mostrado anteriormente se coloca de esta manera

Código: [Seleccionar]
public void setMatricula (String a) { vehiculoTaxi.setMatricula(a); }


El ejercicio compila normalmente sin que la "a" este haciendo referencia a ningun valor del metodo estipulado en la clase Taxi... Y por que no se iguala con el parametro como veniamos haciendolo?? No se si me supe dar a entender pero si alguien me entiende por favor expliquemelo que no quiero continuar con vacios... y mas cuando es precisamente el tema donde se empieza a trabajr con objetos...
« Última modificación: 11 de Junio 2017, 17:43 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
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...

Código: [Seleccionar]
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:
Código: [Seleccionar]
public void setMatricula (String valorMatricula)
Código: [Seleccionar]
public void setMatricula (String a)
Código: [Seleccionar]
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..
Código: [Seleccionar]
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..

Citar
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.
Código: [Seleccionar]
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 "=".
Código: [Seleccionar]
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í:
Código: [Seleccionar]
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.
« Última modificación: 01 de Abril 2017, 02:45 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Edwin

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Hola ! oye muchas gracias por tu respuesta,!! Y si, contestaste mis inquietudes de manera correcta, entendiste muy bien las dudas que tenia y por supuesto mejor la aclaración, pude resolver el ejercicio pero quedaba mis dudad por que solo seguí el ejemplos pero ya con tu aclaración entendí la lógica de la sintaxis...  De verdad muchas gracias!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".