Beruflich Dokumente
Kultur Dokumente
Paso 1: Operativa
Crear la Clase Televisor
En este caso, como esta Clase no va a contener ningn mtodo main(...)
package paqtvestandar;
o de momento, saber que esta primera lnea es necesaria para indicar que la Clase Televisor
pertenece al paquete paqtvestandar
int canal;
o los datos o variables definidos en una clase se llaman variables de instancia o atributos , porque
cada Instancia de una Clase, es decir, cada Objeto de la Clase contiene una copia propia de estas
variables
o imaginemos una fbrica de coches que tiene un molde de un modelo de coche (una Clase) del
cual se fabrican nuevos coches (Instancias u Objetos).
un ejemplo de variables de instancia o atributos de estos coches que estn en circulacin
(Objetos) podran ser
la matrcula
el nmero de bastidor
el color
o en nuestro caso, tenemos que aadir esta lnea para indicar que la Clase Televisor tiene una
variable de instancia de tipo int que se llama canal
Nota: Recordemos que esta Clase al tener un mtodo main(...) la vamos a tener que crear eligiendo New | Java
Main Class...
package paqtvestandar;
public class Aplicacion {
public static void main(String[] args) {
// TODO code application logic here
}
}
Televisor tv;
o en este punto estamos declarando una variable de referencia tv. De momento su valor es null ya
que todava no apunta a ninguna Instancia u Objeto
tv = new Televisor();
o el operador new nos indica que se acaba de crear un nuevo Objeto, que es una Instancia de la
Clase Televisor
o ahora la variable de referencia tv contiene la direccin de memoria de dicha Instancia
tv.canal = 3;
o como ya tenemos una referencia al Objeto de tipo Televisor, ahora hablamos con su variable de
instancia canal y le decimos que le pasamos el valor 3
System.out.println("El canal seleccionado es el: " + tv.canal);
o mostramos un mensaje indicando el nmero del canal del Objeto de tipo Televisor
Paso 2: Funcionalidad
En este paso vamos a hacer que el usuario pueda subir y bajar el canal del televisor
tipoValorDevuelto
o especifica el tipo de dato devuelto por el mtodo
o ser void, si el mtodo no devuelve ningn valor
o los mtodos que devuelven un valor utilizan la sentencia return
Nota: A pesar de que a priori puede parecer ms rpido y cmodo copiar y pegar el cdigo de ejemplo
que estamos siguiendo, te sugiero que lo escribas t mismo en el entorno de NetBeans para que te vayas
familiarizando con ste
o vers que cuando por ejemplo escribes tv. entonces te aparece un men emergente indicndote
cuales son los mtodos que puedes invocar y el tipo de datos que retorna
o si por ejemplo has escrito tv.su y quieres que tambin te aparezca el men emergente, entonces
lo que tienes que hacer es presionar la tecla Control y seguidamente la barra espaciadora
o trabajando de esta forma consigues no cometer fallos de escritura, porque es el mismo entorno
quien va escribiendo el cdigo
tv.subirCanal();
o como tenemos la variable de referencia tv que apunta a una instancia de tipo Televisor, entonces
nos es posible hablar con el mtodo subirCanal()
System.out.println("El canal seleccionado es el: " + tv.getCanal());
o el mtodo getCanal() nos devuelve un int indicndonos el nmero actual del canal del televisor
Paso 3: Funcionalidad
En este paso vamos a crear dos televisores utilizando diferentes Constructores y vamos a subir y bajar el canal
de los mencionados televisores.
Polimorfismo a travs de la sobrecarga de mtodo
Los Constructores se declaran de la siguiente forma
nombreDelConstructor(listaDeParmetros){
cuerpoDelConstructor
}
tipoValorDevuelto
4
Nota: para ver tambin la convencin de nombres en los Constructores podemos seguir el vnculo Apndice Convenciones Java y UML - Maysculas y minsculas (II)
A la Clase Televisor le vamos a aadir 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 despus de haber aadido el Constructor sobrecargado en la Clase Televisor, aparece
el siguiente error en la Clase Aplicacion
5
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
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;
}
}
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();
7
Paso 4: Funcionalidad
En este paso no vamos a permitir la creacin de un televisor con un valor de canal negativo
Si el valor de un canal es menor que 0, entonces el canal asignado ser el 0.
Sentencia de control de flujo if-else
La sentencia if se utiliza para dirigir la ejecucin de un programa hacia dos caminos diferentes.
Esta es la sintaxis de un control de flujo if-else
if (condicin) {
sentencia1;
sentencia2;
}
else {
sentencia3;
sentencia4;
}
if (condicion) {
o despus de la palabra reservada if, siempre tenemos que abrir un parntesis para incluir dentro
una condicin
o condicin
8
en la siguiente tabla podemos ver los distintos operadores utilizados en las condiciones:
Operador
==
!=
>
<
>=
<=
&&
||
Significado
Igual a
Distinto de
Mayor que
Menor que
Mayor o igual
que
Menor o igual
que
AND
OR
else {
o
Si slo hubiera una sentencia, es decir una sola lnea de cdigo nos podramos ahorrar los corchetes
if (condicin)
sentencia1;
else
sentencia3;
if (condicin)
o personalmente prefiero utilizar siempre los corchetes aunque slo haya una sentencia porque
si ms adelante decido aadir una nueva sentencia, los corchetes ya estn all y
tambin me ayudan a tener una legibilidad de cdigo ms clara
Tambin podemos utilizar sentencias if-else-if mltiples que se basan en una sentencia de if anidados
Esta es la sintaxis de un control de flujo if-else-if
if (condicin) {
sentencia1;
sentencia2;
}
else if (condicin) {
sentencia3;
sentencia4;
}
else {
sentencia5;
}
9
Las sentencias if se ejecutan de arriba a abajo de tal forma que tan pronto como una de las condiciones
de control del if sea verdadera, la sentencia o sentencias asociadas se ejecutan y el resto no se tiene en
cuenta
si ninguna de las condiciones es verdadera, entonces se ejecuta la sentencia else final, que acta como
condicin por defecto
o si no hay sentencia else final y todas las otras condiciones son falsas, entonces no se ejecuta
ninguna sentencia
Vamos a crear una pequea aplicacin con varias sentencias if-else-if mltiples para saber en qu estacin se
encuentra un mes en particular.
package paqsentenciascontrol;
public class EstacionesIfElseIf {
public EstacionesIfElseIf() {
}
public static void main(String[] args) {
int mes = 10;
String strEstacion;
if(mes == 12 || mes == 1 || mes == 2){
strEstacion = "invierno";
}
.
.
.
else {
strEstacion = "desconocido";
}
System.out.println("El mes " + mes + " es " + strEstacion);
}
}
las expresiones tienen que ser de tipo int, short, char o byte
No cabe duda que es la mejor alternativa a una larga serie de sentencias if-else-if.
Esta es la sintaxis de una ramificacin mltiple switch
10
switch (expresin) {
case valor1:
sentencia1;
sentencia2;
break;
case valor2:
sentencia3;
sentencia4;
break;
case valor3:
sentencia5;
sentencia6;
break;
default:
sentencia7;
}
Vamos a crear una pequea aplicacin con una sentencias switch para saber en qu estacin se encuentra un
mes en particular.
Y este es parte del cdigo de la Clase EstacionesSwitch teniendo en cuenta que los meses pertenecen a las
siguientes estaciones
invierno: 12, 1 y 2
primavera: 3, 4 y 5
verano: 6, 7 y 8
otoo: 9, 10, 11
desconocido: cualquier nmero que no est entre el nmero 1 y el 12
11
package paqsentenciascontrol;
public class EstacionesSwitch {
public static void main(String[] args) {
int mes = 14;
String strEstacion;
switch (mes){
case 12:
case 1:
case 2:
strEstacion = "invierno";
break;
.
.
.
}
System.out.println("El mes " + mes + " es " +
strEstacion);
}
}
12
Como podemos observar en la salida al inicializar la variable mes a valor 12, se han ejecutado las sentencias
correspondientes al case 12, 1 y 2 hasta que se ha encontrado con la sentencia break del case 2 y entonces se ha
salido de la sentencia switch.
Paso 4: Sin canal negativo
En nuestro caso, no vamos a permitir que se construya una instancia de tipo Televisor con un valor de canal
negativo. Para ello vamos a aadir el siguiente cdigo a la Clase Televisor
package paqtvestandar;
public class Televisor {
int canal;
public Televisor() {
}
public Televisor(int valorCanal) {
if (valorCanal < 0){
canal = 0;
}
else {
canal = valorCanal;
}
}
public void subirCanal() {
canal = canal + 1;
}
public void bajarCanal() {
canal = canal - 1;
}
public int getCanal() {
return canal;
}
}
En la Clase Aplicacion vamos a pasarle un valor negativo al Constructor del segundo Televisor
13
package paqtvestandar;
public class Aplicacion {
public 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(-5);
System.out.println("El canal del segundo televisor es: "+
televisor.getCanal());
System.out.println("El canal seleccionado es el: " + tv.getCanal());
}
}
A travs de la Encapsulacin se puede controlar que partes de un programa pueden acceder a los miembros
(variables de instancia y mtodos) de un Objeto
El hecho de que hasta ahora accediramos al atributo canal de la instancia de tipo Televisor de esta forma
tv.canal = 3; tiene varios inconvenientes. De momento vamos a ver uno de ellos
Ahora compilamos la Clase Televisor y seguidamente abrimos la Clase Aplicacion. Como podemos observar el
compilador nos da un error indicndonos que la variable de instancia canal tiene acceso privado y que por
consiguiente la Clase Aplicacion no se puede compilar
Para evitar estos errores tenemos que realizar unos pequeos cambios en la Clase Aplicacion
Aqu tenemos el cdigo de la Clase Aplicacion
package paqtvestandar;
public class Aplicacion {
public Aplicacion() {
}
public static void main(String[] args) {
Televisor tv;
tv = new Televisor();
System.out.println("El canal por defecto es el: " + tv.getCanal());
// tv.canal = 3;
tv.setCanal(3);
System.out.println("El canal seleccionado es el: " + tv.getCanal());
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(-5);
16
}
}
tv.setCanal(3);
o a diferencia del cdigo de los pasos anteriores tv.canal = 3;
ahora la Clase Televisor no permite que se acceda directamente a su variable de instancia
canal debido a que esta es privada, pero s permite el acceso a su mtodo setCanal()
porque ste es pblico
Estas son las dos Clases que hemos estado utilizando hasta ahora
Televisor
o una Clase se divide en tres partes. En la primera parte tenemos
el nombre de la Clase.
nuestra Clase se llama Televisor
(from paqtvestandar)
aqu nos est indicando que la Clase Televisor pertenece al package
(paquete) paqtvestandar
-canal: int
o una Clase se divide en tres partes. En la segunda parte tenemos
las variables de instancia o atributos
nuestra Clase de momento tiene un atributo que se llama canal y es del tipo
primitivo int
17
para indicar que su mbito es private, se pone el signo menos delante del nombre
del atributo.
+Televisor():
o una Clase se divide en tres partes. En la tercera parte tenemos
los mtodos u operaciones de la Clase
a los Constructores tambin se les considera mtodos
pero como ya sabemos que un Constructor no devuelve ningn valor,
despus de los dos puntos no aparece la palabra reservada void ni ningn
tipo de dato
para indicar que su mbito es public se pone el signo ms delante del nombre del
mtodo
+Televisor(valorCanal:int):
o en este caso este Constructor est sobrecargado con el nombre de una variable llamada
valorCanal de tipo int
+subirCanal():void
o en el interior de los parntesis este mtodo no tiene nada, porque no tiene argumentos
o como este mtodo no devuelve ningn valor, utilizamos la palabra reservada void para indicarlo
+getCanal():int
o como este mtodo retorna un valor de tipo entero, lo indicamos con la palabra reservada int
detrs de los dos puntos ":"
Aplicacion
o este es el nombre de la segunda Clase que hemos creado y que pertenece al mismo paquete
+main(args:String[]):void
o de momento saber que est subrayado porque es static
o
o
esta flecha es una Relacin de Dependencia que nos indica que la Clase Aplicacion depende
puntualmente de la Clase Televisor para poder realizar una serie de acciones
<<instantiate>>
UML utiliza los estereotipos para agregar informacin tanto a las Relaciones como a los
Elementos (un Elemento puede ser por ejemplo una Clase)
adems de los estereotipos estndar de UML, los usuarios de UML podemos
aadir nuevos estereotipos y as hacer que UML sea extensible
en nuestro caso concreto estamos diciendo que una de las acciones que puede realizar la
Clase Aplicacion sobre la Clase Televisor es crear instancias (<<instantiate>>) de tipo
Televisor
De esta forma y siguiendo la convencin de los Constructores explcitos e implcitos tenemos el siguiente
Diagrama de Clases de Diseo con un Constructor por defecto y otro Constructor sobrecargado.
18
gracias a que la operativa bsica de conduccin es relativamente sencilla, el futuro comprador se sentar
en el asiento del conductor y utilizar mtodos pblicos como arrancar(), frenar(), girar(sentido, ngulo)
y acelerar().
o los ingenieros que han creado la Clase Coche han tenido que implementar muchas ms
operativas que las bsicas ya mencionadas
por ejemplo, cuando el futuro comprador ha invocado el mtodo acelerar(), ste mtodo a
su vez ha llamado a otros mtodos como inyectarGasolina(), moverPistones(),
transmitirFuerzaAlPalier() y moverRuedas()
o Si este futuro comparador fuera un desarrollador de software que tiene que interactuar con una
instancia de la Clase Coche, ste podra seguir un Diagrama de Clases como este:
19
en la vida real sucede lo mismo, todas las cosas que nos rodean son Objetos con sus atributos y
operativas para que podamos interactuar con ellos.
si no pudiramos tener diferentes niveles de abstraccin con las cosas que nos rodean,
tendramos que ser expertos en casi todo con el fin de poder utilizarlo
en este ejemplo slo hemos imaginado los mtodos que un ingeniero tendra que implementar
para poder acelerar, pero sigamos imaginando y pensemos en la cantidad de mtodos que todava
se tendran que aadir para por ejemplo realizar giros, frenar o arrancar el coche
gracias a la Encapsulacin, pueden haber desarrolladores especializados en crear Clases de bajo
nivel con una gran complejidad intrnseca, pero que su utilizacin es extremadamente sencilla
de esta forma utilizamos atributos y mtodos de mbito private para realizar tareas de
bajo nivel (todo lo que se encuentra debajo del cap) que slo pueden ser invocadas
desde el interior del propio Objeto y mtodos de mbito public para que puedan ser
invocados tanto desde el interir del propio Objeto como desde otro Objeto
todos los atributos y mtodos de mbito private no se muestran ni se explican en dicha documentacin
pero la gran mayora de los usuarios opinan que nuestro coche les est arruinando sus bolsillos cada vez
que tienen que repostar
debido a esto, nos vemos obligados a realizar una serie de cambios importantes en nuestra Clase para
que los usuarios no se tengan que gastar tanto dinero en combustible
20
por tanto creamos la versin 2.0, la cual ya no funciona con un Carburador sino que funciona con una
BombaInyectora propia de los coches Diesel, e intercambiamos el mtodo inyectarGasolina() por el
mtodo inyectarGasoil().
Entregamos la nueva versin a nuestros usuarios, y les indicamos que la operativa del coche sigue siendo
exactamente la misma que en la versin 1.0.
esto es posible debido a que ellos nunca llegaron a interactuar con el atributo
suministradorCombustible1 ni con el mtodo inyectarGasolina(), y por lo tanto
o nosotros como desarrolladores de la Clase Coche
hemos tenido total libertad y flexibilidad para realizar los cambios necesarios
o y los usuarios
no han tenido que modificar ni una sola lnea de cdigo de los Objetos que interactan
con nuestra Clase
Paso 7: Operativa
Subir y bajar la intensidad del color del televisor
Ahora queremos que el Televisor estndar adems de ofrecer la operativa de cambiar los canales, tambin nos
permita aumentar y disminuir la intensidad del color. Para ello vamos a crear cuatro nuevos mtodos:
21
color");
bajarColorAyuda();
}
private void bajarColorAyuda() {
System.out.println("Televisor - bajarColorAyuda(): sigo bajando el
color");
}
}
23
Al ejecutar la Clase Aplicacion vemos los mensajes correspondientes a los mtodos subirColor() y
subirColorAyuda()
Si descomentamos la invocacin al mtodo subirColorAyuda() apuntado por la variable de referencia tv, vamos
a poder ver que el compilador se queja (y con razn!) porque estamos intentando acceder a un mtodo de
mbito private
Subir y bajar el volumen del televisor
Segn el siguiente Diagrama de Clases de Diseo
Vamos a implementa las Clases Televisor y Aplicacion de tal forma que cuando creemos una instancia de
Televisor, sta ya tenga el volumen por defecto en posicin 5 sin que se lo tengamos que indicar desde la Clase
Aplicacion de forma explcita
Por lo que respecta a la implementacin de los mtodos subirVolumen() y bajarVolumen(), no tendremos en
cuenta los valores negativos ni tampoco el valor mximo del volumen, as que tendremos que implementar estos
mtodos con el siguiente cdigo
volumen = volumen + 1
volumen = volumen - 1
24
package paqtvestandar;
public class Televisor {
private int canal;
private int volumen = 5;
public Televisor() {}
public Televisor(int valorCanal) {
setCanal(valorCanal);
}
public void subirCanal() {
setCanal(canal + 1);
}
public void bajarCanal() {
setCanal(canal - 1);
}
public int getCanal() {
return canal;
}
public void setCanal(int valorCanal) {
if (valorCanal < 0){
canal = 0;
}
else {
canal = valorCanal;
}
}
public void subirColor(){
System.out.println("Televisor - subirColor(): estoy subiendo el color");
subirColorAyuda();
}
private void subirColorAyuda() {
System.out.println("Televisor - subirColorAyuda(): sigo subiendo el color");
}
public void bajarColor(){
System.out.println("Televisor - subirColor(): estoy bajando el color");
bajarColorAyuda();
}
private void bajarColorAyuda() {
System.out.println("Televisor - bajarColorAyuda(): sigo bajando el color");
}
public void subirVolumen() {
volumen = volumen + 1;
}
public void bajarVolumen() {
volumen = volumen - 1;
25
}
public int getVolumen() {
return volumen;
}
}
para ponerlo en prctica, nos vamos a crear un televisor que lo llamaremos TelevisorVirtual y que nos
va a permitir desconectar el sonido en caso de que por ejemplo recibiramos una llamada telefnica y no
quisiramos bajar el volumen paulatinamente,
o es decir invocando al mtodo bajarVolumen() n veces seguidas
26
ms especficas, aadiendo a cada una de estas Clases especficas aquellas cosas que son
particulares a ellas
la Clase general recibe el nombre de Superclase o Clase padre
a las Clases ms especficas se les llama Subclases o Clases hijas
una Subclase puede ser a su vez una Superclase de una Subclase y as
sucesivamente
Ahora vamos a crear una nueva Clase llamada TelevisorVirtual que va a heredar de la Clase Televisor
Este es el cdigo de la Clase TelevisorVirtual
package paqtvestandar;
public class TelevisorVirtual extends Televisor {
private boolean sonido = true;
public void setSonido(boolean valorSonido){
sonido = valorSonido;
}
public boolean isSonido(){
return sonido;
}
}
para que podamos mantener el cdigo de lo que hemos estado haciendo hasta ahora, vamos a realizar
una copia de las Clases Aplicacion y Televisor
o el IDE NetBeans a la copia de estas Clases las llamar Aplicacion_1 y Televisor_1.
28
nosotros seguiremos trabajando sobre las Clases Aplicacion y Televisor y dejaremos las
Clases copiadas como clases histricas para poderlas repasar en el futuro siempre que
queramos
Ahora vamos a hacer que la Clase Aplicacion_1 interacte con la Clase Televisor_1.
package paqtvestandar;
public class Aplicacion_1 {
public static void main(String[] args) {
Televisor_1 tv;
tv = new Televisor_1();
System.out.println("El canal por defecto es el: " + tv.getCanal());
tv.setCanal(3);
System.out.println("El canal seleccionado es el: " + tv.getCanal());
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_1 televisor = new Televisor_1(-5);
System.out.println("El canal del segundo televisor es el: "
+
televisor.getCanal());
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.subirColor();
// tv.subirColorAyuda();
}
}
Modificacin por completo de la Clase Aplicacion
Este es el nuevo cdigo que sustituye al cdigo anterior de Clase Aplicacion
package paqtvestandar;
public class Aplicacion {
public static void main(String[] args) {
TelevisorVirtual tv = new TelevisorVirtual();
tv.setCanal(3);
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.subirColor();
tv.setSonido(false); // Desactivamos el sonido
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
}
}
tv.setCanal(3);
o si nos fijamos, la Clase TelevisorVirtual no contiene el mtodo setCanal(int valorCanal), pero s
que lo tiene su Clase padre Televisor
como TelevisorVirtual hereda de Televisor, la variable de referencia tv puede invocar
tanto a mtodos propios de la Clase TelevisorVirtual como a mtodos propios de la Clase
Televisor
tv.setSonido(false);
o desactivamos el sonido
System.out.println("El telvisor tiene el sonido: " + tv.isSonido());
o verificamos que el sonido est desactivado
30
+subirVolumen():void
o la segunda forma de implementar el Polimorfismo es a travs de la sobreescritura de mtodo. (La
primera forma de implementarlo fue a travs de la sobrecarga de mtodo)
la sobre escritura de mtodo consiste en volver a implementar en la Subclase uno o ms
mtodos que ya estn implementados en la Superclase
esta tcnica nos es extremadamente til cuando queremos heredar de una
Superclase pero la operativa de uno o ms mtodos heredados de dicha Superclase
no se ajusta a la operativa que nosotros queremos aplicar a la nueva Subclase
para que dos mtodos tengan la misma signatura, stos tienen que tener
el mismo nombre de mtodo
el mismo nmero de argumentos
y que estos argumentos coincidan con el mismo tipo de datos
dentro de este mtodo tenemos que escribir nuestro nuevo cdigo
super.subirVolumen();
la palabra clave super, se utiliza para indicar que queremos invocar un mtodo que se
encuentra en la Superclase y as poder distinguirlo del mismo mtodo que se encuentra en
la Subclase.
en nuestro caso, la funcionalidad de bajarVolumen() de la Superclase Televisor se
ajusta a nuestras necesidades y por tanto no la volvemos a escribir. De esta forma
nos ahorramos tener que volver a escribir o cortar-y-pegar el mismo
cdigo
y sobre todo evitamos tener el mismo cdigo diseminado por toda la
aplicacin, y con el consiguiente engorro y el riesgo de error de tener que
actualizarlo en "800" sitios si se tuviera que modificar dicho cdigo
if (this.isSonido() == false){
la palabra clave this, se utiliza para indicar que queremos invocar a un mtodo que se
encuentra en la propia Clase.
en nuestro caso, invocamos al mtodo this.isSonido() para saber si el sonido est
conectado o desconectado
if (!isSonido()){
la ausencia de la palabra clave this, tambin se utiliza para indicar que queremos invocar
a un mtodo que se encuentra en la propia Clase.
si el cdigo lo genera un Asistente o Wizard del entorno de desarrollo, ste lo que
acostumbra hacer al escribir cdigo por nosotros es poner de forma explcita la
palabra clave this.
si el cdigo lo escribimos nosotros, lo habitual es no utilizar la palabra clave this,
porque sin ella ya se sobreentiende que estamos invocando a mtodos de nuestra
propia Clase
(!isSonido())es equivalente a (isSonido() == false)
setSonido(true);
activamos el sonido
o
o
tv.subirVolumen();
o desde la Clase Aplicacion nos es totalmente transparente el hecho de que ahora el mtodo
subirVolumen() est sobrescrito en la Clase TelevisorVirtual, desde aqu no percibimos ninguna
diferencia
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
o comprobamos que el sonido se ha activado sin que se lo hayamos indicado de forma explcita
con el mtodo setSonido(true)
Al ejecutar la Clase Aplicacion vemos como el sonido se ha activado por el hecho de haber subido el volumen
33