Hoy acabaremos todo lo relacionado con la herencia. Abordaremos los temas de modificadores de acceso tanto para atributos como para clases o métodos, explicaremos para que se utiliza y qué es la conversión de referencia.
Junto con el tema de herencia y polimorfismo completaremos un bloque que nos resultará muy útil si vamos a seguir programando en Java. Muchos de los conceptos e ideas de programación que hemos visto hasta aquí, lo utilizaremos a partir de ahora muy a menudo.
Comencemos con el temario de este volumen.
Modificadores de acceso
Modificadores de acceso para miembros de clases:
- <ninguno>: accesible desde el paquete
- public: accesible desde todo el programa
- private: accesible sólo desde esa clase
- protected: accesible desde el paquete y desde sus subclases en cualquier paquete
Aviso: Definir atributos protected NO es una buena práctica de programación.
- Ese campo sería accesible desde cualquier subclase.
Puede haber muchas y eso complicaría enormemente la tarea de mantenimiento.
- Además el campo es accesible desde todas las clases del paquete.
Uso recomendado del modificador de acceso protected
- Regla general: todos los campos de una clase son privados.
- Se proporcionan métodos públicos para leer y/o cambiar los campos (pero sólo cuando sea necesario).
- En el caso de que se desee que un campo sólo pueda ser leído y/o cambiado por las subclases se hacen métodos protected
Paquete (subclases o no).
Por lo tanto y lo que respecta a los modificadores de acceso aplicados a métodos y atributos de las clases:
- TODOS los atributos de las clases que programemos serán privados.
- Si queremos modificar algún atributo desde otra clase, haremos un método para poder modificarlo, sin usar directamente el atributo (ahora no podremos porque son privados).
- Los métodos seguirán siendo públicos.
- Solo pondremos un método privado cuando este método únicamente sea utilizado desde métodos de la propia clase.
- Conversión de referencias(casting)
Es posible convertir referencias.
El casting cambia el “punto de vista” con el que vemos al objeto
- A través de v le vemos como un Vehículo (y por tanto sólo podemos invocar métodos de esa clase).
- A través de c le vemos como un Coche (y podemos invocar cualquiera de los métodos de esa clase).
Hacer una conversión de tipos incorrecta produce una excepción ClassCastException en tiempo de ejecución.
Java proporciona el operador instanceof que permite conocer la clase de un objeto.
- “v instanceof Coche” retorna true si v apunta a un objeto de la clase Coche o de cualquiera de sus (posibles) subclases
Con esto hemos llegado al final de esta entrega.
En la próxima entrega como ya os comentamos, se propondrá un ejercicio, de momento no muy complejo, que consistirá básicamente en una toma de contacto con la herencia de Java. Cuando esto esté ya afianzado, os propondremos uno más complejo en el que tengáis que utilizar más conocimiento. De momento para cerrar el este capitulo, os dejo un resumen con lo más importante de herencia y polimorfismo.
Herencia
Las clases se pueden extender.
- La subclase hereda los atributos y métodos de la superclase.
Al extender una clase se pueden redefinir sus operaciones.
- Si se desea, se puede invocar desde la nueva operación a la de la superclase: programación incremental.
A la subclase se le pueden añadir nuevas operaciones y atributos.
Polimorfismo
El polimorfismo nos permite abstraer operaciones.
- Podemos invocarlas sin preocuparnos de las diferencias existentes para objetos diferentes.
- El sistema elige la operación apropiada al objeto.
El polimorfismo se asocia a las jerarquías de clases:
- Una superclase y todas las subclases derivadas de ella directa o indirectamente.
El polimorfismo en Java consiste en dos propiedades:
- Una referencia a una superclase puede apuntar a un objeto de cualquiera de sus subclases.
- La operación se selecciona en base a la clase del objeto, no a la de la referencia.
Os esperamos en el siguiente volumen!! Muy pronto empezaremos con gráficos!!