| Fundamentos | |
| Inicio | Cursos infosintesis.net liberados | JavaSE | Iniciación a la Orientación a Objetos paso a paso | |
| Creación de un Televisor estándar | |
| Paso 12: Operativa |
Debido a la facilidad de uso, fiabilidad y calidad de nuestro televisor estándar, hemos conseguido que una empresa que se dedica a la fabricación de televisores se interese por el televisor estándar y se lo hemos vendido como base para sus modelos de televisores.
Este fabricante de televisores está creando un nuevo modelo de televisor con pantalla de plasma
El TelevisorPlasma pertenece al paquete paqtvfabricante tal y como podemos ver en el siguiente Diagrama de Clases de diseño

Viendo el potencial de clientes que podemos tener con un perfil de fabricantes de televisores, y que se van a crear ellos mismos diferentes modelos de televisores con diferentes tecnologías para mostrar imágenes en sus pantallas (Plasma, TFT, Cristal líquido, etc...), queremos que los desarrolladores de dichos fabricantes tengan los mismos accesos a las partes internas del televisor que nosotros tuvimos cuando lo creamos.
Tal y como hemos diseñado la Clase Televisor de momento esto no es posible. Veamos que es lo que sucede si la Clase TelevisorPlasma quiere acceder al método privado subirColorAyuda() perteneciente al paquete paqtvestandar y además se crea una nuevo método para su televisor de plasma llamado subirColorAyuda2(). De la misma forma también se querrá bajar la intensidad del color del televisor

Nos vamos a crear un paquete llamado paqtvfabricante y una Clase llamada TelevisorPlasma.
Este es el código correspondiente a la Clase TelevisorPlasma
| package paqtvfabricante; import paqtvestandar.Televisor; public class TelevisorPlasma extends Televisor { |
Ahora vamos a descomentar la invocación al método subirColorAyuda(). Debido a que este método tiene el ámbito o acceso privado en la Superclase Televisor, desde la Clase hija no podemos acceder. Este es el mensaje del error:

Y esta es la Clase Aplicacion perteneciente al paquete paqtvfabricante
| package paqtvfabricante; public class Aplicacion { public static void main(String[] args) { TelevisorPlasma tv = new TelevisorPlasma(); tv.setCanal(3); System.out.println("El canal seleccionado es el: " + tv.getCanal()); tv.subirColor(); tv.usarMenu(); // tv.subirColorAyuda(); } } |
El modificador protected
Ahora modificamos la Clase Televisor para que otras Clases hijas que pertenezcan tanto al mismo paquete como a otros paquetes puedan tener visibilidad de los métodos subirColorAyuda() y bajarColorAyuda()

Esta es la Clase Televisor modificada
| package paqtvestandar;
public abstract class Televisor { |
Compilamos la Clase Televisor y descomentamos la invocación al método subirColorAyuda() desde la Clase TelevisorPlasma
Demostración de que en Java se puede tener visibilidad de un miembro protected desde cualquier otra Clase que pertenezca al mismo paquete
Para ver que podemos acceder al método subirColorAyuda() de la Clase Televisor desde la Clase Aplicacion del paquete paqtvestandar vamos a añadir la siguiente línea de código a la Clase Aplicacion del paquete paqtvestandar
| 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); System.out.println("El telvisor tiene el sonido: " + tv.isSonido()); tv.subirVolumen(); System.out.println("La posición del volumen es: " + tv.getVolumen()); System.out.println("El televisor tiene el sonido: " + tv.isSonido()); tv.usarMenu(); tv.subirColorAyuda(); } } |
Demostración de que en Java NO se puede tener visibilidad de un miembro protected desde cualquier otra Clase que pertenezca a OTRO paquete
Recordemos que este es el código de la Clase Aplicacion del paquete paqtvfabricante
| package paqtvfabricante; public class Aplicacion { public Aplicacion() { } public static void main(String[] args) { TelevisorPlasma tv = new TelevisorPlasma(); tv.setCanal(3); System.out.println("El canal seleccionado es el: " + tv.getCanal()); tv.subirColor(); tv.usarMenu(); // tv.subirColorAyuda(); } } |
Ahora lo ejecutamos y obtenemos el siguiente resultado
Sin embargo si descomentamos la invocación al método subirColorAyuda() desde la Clase Aplicacion vemos que el compilador se sigue quejando

Siguiendo el ejemplo del concesionario de coches que nos permitían probar un coche. Podemos decir que si utlizamos el coche como usurios normales no tenemos acceso a los mecanismos encapsulados que hay debajo del capó
La siguiente tabla nos será de gran ayuda cuando queramos despejar cualquier duda sobre los controles de acceso o ámbito
control de acceso o ámbito |
public |
private |
friendly |
protected |
|
mismo paquete |
misma Clase otra Clase una Subclase |
sí sí sí |
sí no no |
sí sí sí |
sí sí sí |
otro paquete
|
otra Clase una Subclase |
sí sí |
no no |
no no |
no sí |