miércoles, 2 de marzo de 2016

Los métodos en JAVA - 3 de 3



Parámetros y argumentos

Los parámetros de un método definen la cantidad y el tipo de dato de los valores que recibe un método para su ejecución. Los argumentos son los valores que se pasan a un método durante su invocación. El método recibe los argumentos correspondientes a los parámetros con los que ha sido declarado.
Un método puede tener tantos parámetros como sea necesario. La lista de parámetros de la cabecera de un método se define con la siguiente sintaxis:

tipo nombre [,tipo nombre ]

Por ejemplo, el método constructor de la clase Vehiculo tiene cinco parámetros, la matrícula, la marca, el modelo, el color del vehículo y su tarifa. Los parámetros matricula, marca, modelo y color son de tipo String, tarifa es de tipo double.

public Vehiculo(String matricula,
String marca,
String modelo,
String color,
double tarifa) {
}

El método setTarifa(double tarifa) de la clase Vehiculo tiene un parámetro tarifa de tipo double.

public void setTarifa(double tarifa) {
}

Durante la invocación de un método es necesario que el número y el tipo de argumentos coincidan con el número y el tipo de parámetros declarados en la cabecera del método.
Por ejemplo, es correcto invocar al método setTarifa(double tarifa) del objeto vehiculo1 pasando un argumento de tipo double.

vehiculo1.setTarifa(100.0); // invocación correcta
vehiculo1.setTarifa(90.0); // invocación correcta

La invocación del método no es correcta si se pasan dos argumentos de tipo double o un argumento de tipo String porque la cabecera del método solo incluye un parámetro double. Las invocaciones del método setTarifa(double tarifa) son incorrectas.

vehiculo1.setTarifa(100.0, 20.0); // no es correcto
vehiculo1.setTarifa("100.0"); // no es correcto

Los dos ejemplos anteriores no son válidos porque la lista de argumentos del método setTarifa(double tarifa) no coincide con la lista de parámetros de la declaración de este método. 

Durante el proceso de compilación se comprueba que durante la invocación de un método se pasan tantos argumentos como parámetros tiene declarados y que además coinciden los tipos. Esta es una característica de los lenguajes que se denominan “strongly typed” o “fuertemente tipados”.


Paso de parámetros

Cuando se invoca un método se hace una copia de los valores de los argumentos en los parámetros. Esto quiere decir que si el método modifica el valor de un parámetro, nunca se modifica el valor original del argumento. 
Cuando se pasa una referencia a un objeto se crea un nuevo alias sobre el objeto, de manera que esta nueva referencia utiliza el mismo espacio de memoria del objeto original y esto permite acceder al objeto original. 



Por ejemplo, el método recibirVehiculoAlquilado(Vehiculo v) recibe el parámetro v de tipo Vehiculo. Si el método modifica el estado del objeto v, en realidad modifica el estado del objeto original vehiculo1 que recibe como argumento.

public void recibirVehiculoAlquilado (Vehiculo v) {
v.setDisponible(true);
}

En el siguiente programa Java, en el método main() se crea un objeto vehiculo1 de la clase Vehiculo. Al instanciar el objeto, el método constructor asigna el valor false al atributo disponible, pero al invocar al método recibirVehiculoAlquilado(Vehiculo v) con el objeto vehiculo1, se modifica su disponibilidad.

public class MisVehiculos {
public static void recibirVehiculoAlquilado(Vehiculo v) {
v.setDisponible(true);
}
public static void main(String args[]) {
Vehiculo vehiculo1 = new Vehiculo("4050 ABJ",
"VW",
"GTI",
"Blanco",
100.0);
// el valor del atributo disponible de vehiculo1 es false
System.out.println("El objeto vehiculo1 está disponible: " +
vehiculo1.getDisponible());
recibirVehiculoAlquilado (vehiculo1);
// el valor del atributo disponible de vehiculo1 es true
System.out.println("El objeto vehiculo1 está disponible: " +
vehiculo1.getDisponible());
}
}

La salida por la consola:

El objeto vehiculo1 está disponible: false
El objeto vehiculo1 está disponible: true


El valor de retorno

Un método puede devolver un valor. Los métodos que no devuelven un valor se declaran void, mientras que los métodos que devuelven un valor indican el tipo que devuelven: int, double, char, String o un tipo de objeto.
Los métodos ‘set’ devuelven void, mientras que los métodos ‘get’ devuelven el tipo correspondiente al atributo al que hacen referencia. Los métodos ‘set’ devuelven void porque son métodos modificadores, realizan operaciones y cálculos para modificar el estado de los objetos. Los métodos ‘get’, en cambio, son métodos de consulta y devuelven los valores almacenados en los atributos de un objeto.

Por ejemplo, el método setTarifa(double tarifa) recibe el parámetro tarifa de tipo double y devuelve void. 

public void setTarifa(double tarifa) {
this.tarifa = tarifa;
}

El método getTarifa() devuelve el tipo double correspondiente al atributo tarifa. El valor del atributo se devuelve con return.

public double getTarifa() {
return this.tarifa;
}


Las variables locales de un método

Las variables locales de un método son útiles para almacenar valores temporales cuyo tiempo de vida coincide con el método.

Por ejemplo, el método getAtributos() no utiliza variables locales. El valor de retorno se calcula al momento de hacer return.

public String getAtributos() {
return "Matrícula: " + getMatricula() + " " +
" Modelo: " + getMarca() + " " + getModelo() +
" Color: " + getColor() +
" Tarifa: " + getTarifa() +
" Disponible: " + getDisponible;
}

Este método se podría codificar declarando la variable local atributos de tipo String para almacenar el valor de retorno. Esta variable se declara dentro del cuerpo del método.

public String getAtributos() {
String atributos;
atributos = "Matrícula: " + getMatricula() + " " +
" Modelo: " + getMarca() + " " + getModelo() +
" Color: " + getColor() +
" Tarifa: " + getTarifa() +
" Disponible: " + getDisponible;
return atributos;
}

Los dos métodos son equivalentes, pero el primero es más claro porque evita el uso de una variable local que no es necesaria.


Sobrecarga de métodos

La sobrecarga de métodos es útil para que el mismo método opere con parámetros de distinto tipo o que un mismo método reciba una lista de parámetros diferente. Esto quiere decir que puede haber dos métodos con el mismo nombre que realicen dos funciones distintas. La diferencia entre los métodos sobrecargados está en su declaración.

Por ejemplo, el método getAtributos() se puede sobrecargar para devolver los atributos de un vehículo y para mostrar la tarifa reducida al aplicar el porcentaje de descuento recibido como argumento.

public String getAtributos() {
return "Matrícula: " + getMatricula() + " " +
" Modelo: " + getMarca() + " " + getModelo() +
" Color: " + getColor() +
" Tarifa: " + getTarifa() +
" Disponible: " + getDisponible;
}
public String getAtributos(double porcentajeDescuento) {
return "Matrícula: " + getMatricula() + " " +
" Modelo: " + getMarca() + " " + getModelo() +
" Color: " + getColor() + " Tarifa: " +
(100.0 – porcentajeDescuento)/100*tarifa +
" Disponible: " + getDisponible;
}

En este ejemplo los dos métodos se diferencian por la declaración de sus parámetros y ambos métodos realizan operaciones distintas.


Espero haber ayudado en algo. Hasta la próxima oportunidad!











  

No hay comentarios:

Publicar un comentario en la entrada