Departamento de Ingeniería Electrónica y Computadoras Mg. Ricardo Coppo rcoppo@uns.edu.ar
La herencia establece una relación entre dos clases, un ancestro o superclase y otro derivado o descendiente Por lo general modela una relación del tipo Es un(a) Un DetectorDeHumo es un Sensor 2
Características Las relaciones de herencia establecen jerarquías de clases La superclase generaliza la clase derivada y la subclase especializa a la superclase La subclase accede a los miembros de la superclase como si fueran propios, solamente agrega o redefine aquellas que son diferentes 3
Notación UML Superclase Sensor Subclase Clase Derivada SensorDeMovimiento 4
Jeraquía de clases Sensor SensorMovimiento SensorRadar SensorIR SensorOptico 5
Código Java El proyecto tiene 5 archivos.java Un archivo cada clase 6
Visibilidad Cualquier miembro publica o protegida de una superclase es visible dentro de la subclase Si activar() es un miembro de Sensor, entonces también es visible dentro de la clase SensorMovimiento activar() también será visible dentro de la clase SensorRadar porque es descendiente (indirecto) de Sensor 7
Visibilidad Un miembro protegido (protected) solamente puede ser accedido por la clase en la que se define o por una de las subclases derivadas por herencia Si un miembro de la superclase se declara privado, este no será visible en ninguno de sus descendientes 8
UML del ejemplo 9
Ejemplo 10
Ejemplo 11
Ejemplo activar() y desactivar() son métodos de la clase Sensor 12
Constructores Cada clase derivada debe definir sus propios constructores. Si no se define, Java provee el constructor por defecto. Este constructor invoca al constructor sin parámetros de la superclase Es habitual construir una clase derivada construyendo primero la parte heredada. 13
super( ) Constantes definidas dentro de la clase Invocacíón del constructor de la superclase Uso de la constante ON perteneciente a la clase Sensor 14
Redefinición Una subclase puede redefinir o sobrescribir propiedades y métodos de la superclase Cada miembro posee una signatura o prototipo que lo identifica int i, double d, void setx( double x) La redefinición no puede modificar la signatura 15
Redefinición 16
Redefinición La redefinición de uno de los miembros de una clase ancestro se propaga hacia todos los descendientes de la clase a su vez. La redefinición del método activar() de la clase SensorMovimiento se propaga a las clases SensorRadar, SensorIR, SensorOptico. 17
Redefinición Si dos clases se encuentran en el mismo nivel jerárquico cada uno puede sobrescribir uno de los miembros del ancestro en forma diferente Si se redefine el método activar() en las subclases SensorRadar y SensorIR, estas podrán ser diferentes Siempre se puede invocar al método de la superclase mediante super 18
Clases y miembros finales Cuando el diseñador de una clase no desea permitir derivar subclases por herencia lo declara como final. Si se quiere impedir el uso de redefinición para sobrescribir miembros de una clase se los declara como final 19
La clase Object Todas las clases de Java son descendientes de la clase Object No es necesario en la definición de clase indicarlo expresamente (extends Object) Como consecuencia de lo anterior, los métodos publicos de Object se encuentran disponibles en todas las clases del programa 20
Clase Object Object MiPrograma Sensor 21
Clase Object 22
Departamento de Ingeniería Electrónica y Computadoras Mg. Ricardo Coppo rcoppo@uns.edu.ar