martes, 11 de julio de 2017

Todo sobre: Constructores en Java

Constructores
Para crear un objeto se utiliza el operador new. Si no se ha definido un método constructor para la clase, entonces el objeto se instancia indicando el nombre de la clase y a continuación un paréntesis abierto y otro cerrado.

Si ya se ha definido un método constructor, entonces no es posible instanciar un objeto utilizando el constructor por defecto. Cuando se invoca al constructor por defecto se asigna un espacio de memoria para el nuevo objeto y sus atributos se inicializan a los valores por defecto correspondientes a su tipo. Los números enteros se inicializan a cero, los números reales a 0.0, los valores lógicos a false, los caracteres se inicializan a \u0000 y las referencias a null.

En una clase se pueden definir uno o más métodos constructores para iniciar los atributos de un objeto con valores distintos de los valores por defecto de Java. Para instanciar un objeto es necesario indicar los valores iniciales de sus atributos cuando se ejecuta el método constructor. En la clase Vehiculo se ha definido un método constructor que inicia los atributos matricula, marca, modelo, color y tarifa.



A veces es necesario contar con diferentes métodos constructores con distintos parámetros. Por ejemplo, se podría crear un objeto de la clase Vehiculo sin conocer la tarifa de alquiler. El método constructor debería iniciar la tarifa a cero.

public Vehiculo(String matricula,
String marca,
String modelo,
String color) {
this.matricula = matricula;
this.marca = marca;
this.modelo = modelo;
this.color = color;
this.tarifa = 0.0;
this.disponible = false;
}

Cuando se definen dos o más métodos constructores para la clase Vehiculo, se dice que el método constructor de la clase está sobrecargado. En este ejemplo la diferencia entre los dos métodos es que el primero recibe cuatro parámetros e inicia la tarifa a cero, el segundo recibe cinco parámetros, uno de ellos para iniciar la tarifa del vehículo.

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

La clase Vehiculo con dos métodos constructores.

public class Vehiculo {
private String matricula;
private String marca;
private String modelo;
private String color;
private double tarifa;
private boolean disponible;
public Vehiculo(String matricula,
String marca,
String modelo,
String color) {
this.matricula = matricula;
this.marca = marca;
this.modelo = modelo;
this.color = color;
this.tarifa = 0.0;
this.disponible = false;
}
public Vehiculo(String matricula,
String marca,
String modelo,
String color,
double tarifa) {
this.matricula = matricula;
this.marca = marca;
this.modelo = modelo;
this.color = color;
this.tarifa = tarifa;
this.disponible = false;
}
}

Java diferencia los métodos sobrecargados por el número y el tipo de los argumentos que tiene el método. En la clase Vehiculo el número de parámetros de los dos métodos constructores es diferente.

Cuando se invoca al método constructor de la clase con el operador newJava selecciona el método que debe ejecutar por el número y el tipo de argumentos que recibe.

Creación de objetos de la clase Vehiculo utilizando ambos métodos constructores.

Vehiculo vehiculo1 = new Vehiculo("4050 ABJ",
"VW",
"GTI",
"Blanco",
100.0);
Vehiculo vehiculo2 = new Vehiculo("2345 JVM",
"SEAT",
"León",
"Negro");



El objeto vehiculo1 se instancia ejecutando constructor de cinco parámetros, mientras que vehiculo2 se instancia ejecutando el constructor de cuatro parámetros.

Todo sobre: Parámetros y argumentos en Java

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.