| Creación de un Televisor estándar |
| Paso 3: Operativa |
Polimorfismo a través de la sobrecarga de método
Los Constructores se declaran de la siguiente forma
nombreDelConstructor(listaDeParámetros){
cuerpoDelConstructor
}
|
- tipoValorDevuelto
- un Constructor no devuelve ningún valor, ni siquiera void
- de hecho lo que devuelve es la posición de memoria dónde residirá el objeto que se acaba de crear
- pero esta posición de memoria a nivel numérico interno (@FF00AC) está destinada a la MVJ y no al desarrollador
- de esta forma Java consigue que sus aplicaciones sean más fiables y seguras ya que no nos permite posicionarnos en una dirección de memoria directamente, si no que nos obliga a acceder a estas direcciones a través de las variables de referencia devueltas por los Constructores al crear un objeto
- nombreDelConstructor
- el nombre del Constructor es el mismo que el nombre de la Clase. Y siguiendo la convención de nombres en Java, este nombre tendría que tener
- la primera letra de la primera palabra compuesta en mayúsculas
- la primera letra de la segunda y restantes palabras compuesta en mayúsculas
- por tanto una forma rápida de distinguir un Constructor de un método es por la primera letra de la palabra compuesta
- como ya sabemos en el Constructor esta letra será mayúscula y en el caso de un método será minúscula
Nota: para ver también la convención de nombres en los Constructores podemos seguir el vínculo Apéndice - Convenciones Java y UML - Mayúsculas y minúsculas (II)
A la Clase Televisor le vamos a añadir un Constructor sobrecargado
| package paqtvestandar;
public class Televisor {
int canal;
public Televisor(int valorCanal) {
canal = valorCanal;
}
public void subirCanal() {
canal = canal + 1;
}
public void bajarCanal() {
canal = canal - 1;
}
public int getCanal() {
return canal;
}
} |
Como podemos observar después de haber añadido el Constructor sobrecargado en la Clase Televisor, aparece el siguiente error en la Clase Aplicacion
- cannot find symbol
symbol: constructor Televisor()
location: class paqtvestandar.Televisor
Create Constructor Televisor() in paqtvestandar.Televisor

Este error nos indica que no encuentra el Constructor sin argumentos de la Clase Televisor. Por tanto, nos vemos obligados a escribir el Constructor de la Clase Televisor aunque no tenga contenido
- si la Clase sólo tiene un Constructor sin argumentos y no queremos implementarlo
- no hace falta que éste esté escrito dentro de la Clase
- si por el contrario, la Clase tiene al menos un Constructor sobrecargado como por ejemplo Televisor(int valorCanal) y no queremos implementar el Constructor sin argumentos
- el Constructor sin argumentos tiene que estar escrito dentro de la Clase aunque no tenga contenido
- en cualquiera de los dos casos anteriores, el runtime de Java se crea una especie de Constructor interno que se denomina Constructor por defecto que utiliza para inicializar todas las variables de instancia de la Clase con unos valores por defecto
- dependiendo del tipo de datos de las variables de instancia, el Constructor interno asignará unos valores por defecto u otros:
- tipos de datos primitivos
- son aquellos datos que no son Clases, como por ejemplo boolean, int, float, double...
- sus valores por defecto son
- boolean: false
- int: 0
- float: 0.0
- double: 0.0
- tipos de datos no primitivos
- son todas las Clases
- el valor por defecto de las Clases es null
- es decir, son variables de referencia que todavía no apuntan a ningún objeto
- public Televisor(int valorCanal) {
- a este Contructor le hemos añadido un argumento
- el hecho de que ahora tengamos dos Constructores con una signatura diferente (uno sin argumento y el otro con un argumento de tipo int) se le llama Sobrecarga de método y es una de las tres formas de implementar el Polimorfismo
- canal = valorCanal;
- la variable de instancia canal se actualizará cuando se crea una instancia de la Clase Televisor
Para ahondar más sobre esta cuestión podemos ver el Apéndice - Constructores explicitos e implicitos.
Ahora añadimos un Constructor sin argumentos a la Clase Televisor
| package paqtvestandar;
public class Televisor {
int canal;
public Televisor() {}
public Televisor(int valorCanal) {
canal = valorCanal;
}
public void subirCanal() {
canal = canal + 1;
}
public void bajarCanal() {
canal = canal - 1;
}
public int getCanal() {
return canal;
}
} |
y como podemo observar el error ha desaparecido

Crear dos objetos del mismo tipo de forma diferente
En ocasiones nos puede convenir inicializar una o más variables de instancia de un objeto en el mismo momento que lo estamos creando
- si es esto lo que queremos, lo que haremos será pasar los valores de las variables de instancia que queremos inicializar como argumento de un Constructor
Ahora vamos a crear dos objetos de tipo Televisor. Uno de ellos estará referenciado por una variable de referencia llamada tv y el otro por otra variable de referencia llamada televisor
package paqtvestandar;
public class Aplicacion {
public static void main(String[] args) {
Televisor tv;
tv = new Televisor();
System.out.println("El canal por defecto es el: " + tv.canal);
tv.canal = 3;
System.out.println("El canal seleccionado es el: " + tv.canal);
tv.subirCanal();
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.bajarCanal();
System.out.println("El canal seleccionado es el: " + tv.getCanal());
Televisor televisor = new Televisor(6);
System.out.println("El canal del segundo televisor es el: " + televisor.getCanal());
System.out.println("El canal seleccionado es el: " + tv.getCanal());
}
} |
- System.out.println("El canal por defecto es el: " + tv.canal);
- en este caso el mensaje de salida nos dirá que el número de canal es el 0, porque ha sido por un lado declarado por nosotros como variable de instancia y por el Constructor inicializado con su valor por defecto
- Televisor televisor = new Televisor(6);
- hasta el momento, siempre declarabamos primero la varable de referencia y despues creábamos el objeto por motivos didácticos
- lo habitual es que esto se escriba en una sola línea
- en este caso el Runtime de Java sabe que tiene que llamar al Constructor que tiene un argumento de tipo int
- System.out.println("El canal del segundo televisor es el: " + televisor.getCanal());
- el segundo televisor que hemos creado nos indica el canal 6
- System.out.println("El canal seleccionado es el: " + tv.getCanal());
- y el primer televisor que hemos creado nos indica el canal 3
Este es el resultado que obtenemos al ejecutar la Clase Aplicacion