You are on page 1of 11

Herencia Es la derivacin de una clase a partir de otra existente. El objetivo es la reutilizacin del software desarrollado.

POO en Java IV: Herencia


Franco Guidi Polanco
Escuela de Ingeniera Industrial Pontificia Universidad Catlica de Valparaso, Chile f d@ fguidi@ucv.cl l

Herencia

Actualizacin: 17 de noviembre de 2010


Franco Guidi Polanco 2

Superclases y subclaases
Una clase derivada de otra clase recibe tambin el nombre de subclase o clase hija. La clase de la cual se deriva una subclase se denomina clase base, superclase o clase padre.
Vehculos de carga
Superclase Clase base Clase padre Subclase Clase derivada Clase hija

Herencia simple Una clase es subclase de una nica superclase.

Vehculos de carga

Camin

C i Camin

La herencia aplica en relaciones de naturaleza B es un tipo de A


Franco Guidi Polanco 3 Franco Guidi Polanco 4

Herencia mltiple Una clase es subclase de ms de una superclase.

Jerarquas de Herencia La herencia organiza clases bases y derivadas en jerarquas de clases. Una subclase hereda propiedades de la respectiva superclase. Una subclase, b l respecto de d su superclase:
Agrega nuevas propiedades Modifica propiedades heredadas
5 Franco Guidi Polanco

P Persona

Vehculos t terrestres t

Vehculos acuticos ti

Alumno

Profesor

Vehculos anfibios

Alumno pregrado

Alumno magster

Profesor hora

Java no soporta la herencia mltiple.

Franco Guidi Polanco

Implementacin de jerarquas de herencia Ejemplo:

Implementacin de jerarquas de herencia


Para crear una subclase a partir de una superclase, la subclase debe declararse:

Persona

Atributos: - RUT - Nombre

Operaciones: -set y get RUT - set y get Nombre

public class NombreSubclase extends NombreSuperclase

Alumno

Atributos: Operaciones: - RUT -set y get RUT - Nombre - set y get Nombre - Rol UCV - set y get Rol UCV

Franco Guidi Polanco

Franco Guidi Polanco

Implementacin de jerarquas de herencia

Miembros heredados Una subclase hereda de su superclase (por el momento):


Variables de instancia pblicas Mtodos pblicos

public class Persona { private String rut; private String nombre; public Persona() { rut = "00000000-0"; nombre = ""; } public void setRut(String r){ rut t = r; } public String getRut(){ return rut; } public void setNombre(String n){ nombre = n; } public String getNombre(){ return nombre; } }

public class Alumno extends Persona { private String rolUCV; public Alumno() { rolUCV = 000000-0"; } public void setRolUCV(String r){ rolUCV = r; } public bli St String i getRolUCV(){ tR lUCV(){ return rolUCV; } }

Todos los anteriores pueden ser utilizados en la subclase b l como si i hubieran h bi sido id declarados d l d en ella.

Superclase
Franco Guidi Polanco

Subclase
9 Franco Guidi Polanco 10

Miembros no heredados Una subclase no hereda:


Propiedades privadas Constructores

Miembros no heredados: Variables definidas


Las variables privadas no son heredadas, por lo que no pueden aparecer en el cdigo de la subclase. Sin embargo se puede hacer uso indirecto de ellas a travs de los mtodos pblicos de la superclase. Se dice que estas variables se encuentran definidas en la subclase.

Sin embargo es posible hacer un uso indirecto de ellos


Variables definidas Invocacin al constructor de la superclase.

Franco Guidi Polanco

11

Franco Guidi Polanco

12

Miembros no heredados: Variables definidas (cont.)

Miembros no heredados: Variables definidas (cont.)

Ejemplo incorrecto:
public class Persona { private String rut; private String nombre; public Persona() { rut = "00000000-0"; nombre = ""; } public void setRut(String r){ rut t = r; } public String getRut(){ return rut; } public void setNombre(String n){ nombre = n; } public String getNombre(){ return nombre; } }

Variables definidas en Alumno


public class Alumno extends Persona { private String rolUCV; public Alumno() { rolUCV = 000000-0"; } public void setRolUCV(String r){ rolUCV = r; } public bli St String i getRolUCV(){ tR lUCV(){ return rolUCV; } public String quinSoy(){ return rut + nombre + rolUCV; } }

Ejemplo correcto:
public class Persona { private String rut; private String nombre; public Persona() { rut = "00000000-0"; nombre = ""; } public void setRut(String r){ rut t = r; } public String getRut(){ return rut; } public void setNombre(String n){ nombre = n; } public String getNombre(){ return nombre; } } public class Alumno extends Persona { private String rolUCV; public Alumno() { rolUCV = 000000-0"; } public void setRolUCV(String r){ rolUCV = r; } public bli St String i getRolUCV(){ tR lUCV(){ return rolUCV; } public String quinSoy(){ return getRut() + getNombre() + rolUCV; } }

Error: no pueden ser accesadas directamente


Franco Guidi Polanco 13 Franco Guidi Polanco

Esto s funciona
14

Miembros no heredados: Constructores Los constructores no son heredados, por lo que cada subclase debe tener su(s) propio(s) constructor(es). Sin embargo en los constructores se puede invocar al constructor de la superclase con la instruccin: super( lista parmetros ) La instruccin super debe ser la primera instruccin del constructor.
Franco Guidi Polanco 15

Constructores: la verdad parcial


Todo subclase debe incluir una referencia super a algn constructor de la superclase. Si no se incluye la referencia super, Java incluye automticamente una referencia al constructor sin parmetros de la superclase. Es decir incluye: super() Notar que se produce un error cuando no existe un constructor sin parmetros en la superclase y se omite la referencia super en la subclase por qu?

Franco Guidi Polanco

16

Constructores y herencia Dos clases equivalentes:


public class Alumno extends Persona { private String rolUCV; public Alumno() { super(); rolUCV = 000000-0"; } public void setRolUCV(String r){ rolUCV = r; } public String getRolUCV(){ return rolUCV; } public String quinSoy(){ return getRut() + getNombre() + rolUCV; } }
Franco Guidi Polanco

Constructores y herencia Qu pasa en este caso?

public class Alumno extends Persona { private String rolUCV; public Alumno() { rolUCV = 000000-0"; } public void setRolUCV(String r){ rolUCV = r; } public String getRolUCV(){ return rolUCV; } public String quinSoy(){ return getRut() + getNombre() + rolUCV; } }
17

public class Persona { private String rut; private String nombre; public Persona(String r, String n) { rut = r; nombre = n; } public void setRut(String r){ rut = r; } public String getRut(){ return rut; } public void setNombre(String n){ nombre = n; } public String getNombre(){ return nombre; } }

public class Alumno extends Persona { private String rolUCV; public Alumno() { super( 000000-0, N/A ); rolUCV = 000000-0"; } public void setRolUCV(String r){ rolUCV = r; } public String getRolUCV(){ return rolUCV; } public String quinSoy(){ return getRut() + getNombre() + rolUCV; l } }
18

Franco Guidi Polanco

Constructores y herencia: Atencin! Qu pasa en el siguiente caso?


public class Persona { private String rut; private String nombre; public Persona(String r, String n) { rut = r; nombre = n; } public void setRut(String r){ rut = r; } public String getRut(){ return rut; } public void setNombre(String n){ nombre = n; } public String getNombre(){ return nombre; } }
Franco Guidi Polanco

Herencia: la verdad total En Java toda clase extiende otra clase. Las clases que no declaran extender a otras, extienden a la clase Object. Object j es la superclase p (directa o indirecta) ( ) de todas las clases. Todas las clases son subclases de Object o de otra subclase.
Por lo tanto: todos los constructores incluyen (explcitamente o no) una referencia al constructor de su superclase.
Franco Guidi Polanco 20

public class Alumno extends Persona { private String rolUCV; public Alumno() { rolUCV = 000000-0"; } public void setRolUCV(String r){ rolUCV = r; } public String getRolUCV(){ return rolUCV; } public String quinSoy(){ return getRut() + getNombre() + rolUCV; } }
19

Sobreescritura de mtodos
Un mtodo declarado e implementado en una sperclase puede ser reimplementado en una subclase. Esto se d denomina i sobreescritura b it de d mtodos. t d Conceptualmente significa que la subclase realiza la operacin de la sper clase, pero de un modo distinto. Esto es un caso de polimorfismo.
public class Persona { private i S String i rut; private String nombre; public String getRut(){ return rut; } public String getNombre(){ return nombre; } public String identificarse(){ return rut + nombre; } //otros miembros de la clase }
Franco Guidi Polanco

Sobreescritura de mtodos
public class Persona { private String rut, nombre; public Persona(String r, String n){ rut = r; ; nombre = n; ; } public String getRut(){ return rut;} public String getNombre(){ return nombre;} public String identificarse(){ return rut + nombre; } } public class Alumno extends Persona { private String carrera; public Alumno(String p ( g r, , String g n, String c){ super(r,n); carrera = c; } public String identificarse(){ return getRut() + getNombre() + carrera; } }

public class Alumno extends P Persona { private String carrera; public String identificarse(){ return getRut() + getNombre() + carrera; } //otros miembros de la clase }
21

Qu ocurre en las siguientes situaciones?


Persona a = new Persona(100, Persona(100 Matas) Matas); System.out.println( a.identificarse() ); Alumno a = new Alumno(100, Matas, Ind); S t System.out.println( t i tl ( a.identificarse() id tifi () ); )

100Matas 100M t I d 100MatasInd


22

Franco Guidi Polanco

Sobreescritura de mtodos
public class Persona { private String rut, nombre; public Persona(String r, String n){ rut = r; ; nombre = n; ; } public String getRut(){ return rut;} public String getNombre(){ return nombre;} public String identificarse(){ return rut + nombre; } } public class Alumno extends Persona { private String carrera; public Alumno(String p ( g r, , String g n, String c){ super(r,n); carrera = c; } public String identificarse(){ return getRut() + getNombre() + carrera; } }

Sobreescritura de mtodos
public class Persona { private String rut, nombre; public Persona(String r, String n){ rut = r; ; nombre = n; ; } public String getRut(){ return rut;} public String getNombre(){ return nombre;} public String identificarse(){ return rut + nombre; } } public class Alumno extends Persona { private String carrera; public Alumno(String p ( g r, , String g n, String c){ super(r,n); carrera = c; } public String String identificarse(){ identificarse(){ public return getRut() getRut() ++ getNombre() getNombre() return + +carrera; carrera; }} }

Y qu ocurre aqu?
Persona a = new Alumno( 100, Matas, Ind); System.out.println( a.identificarse() );

Y qu ocurre aqu?
Persona a = new Alumno( 100, Matas, Ind); System.out.println( a.identificarse() );

100MatasInd

Java resuelve en tiempo de ejecucin la asociacin entre la variable y el mtodo que debe invocar, en funcin del objeto que se encuentre referenciado en ella.
Franco Guidi Polanco 23 Franco Guidi Polanco 24

Sobreescritura de mtodos
Persona a = new Alumno( 100, Matas, Ind); System.out.println( a.identificarse() );

Reconocimiento de clases: operador instanceof El operador instanceof permite reconocer la clase a la que pertenece un objeto referenciado desde una variable determinada. Formato: NombreVar instanceof NombreClase Ejemplo:
if( pers instanceof Persona ) System.out.println( y p ( La variable p pers referencia a una Persona ); else System.out.println( La variable pers no referencia a una Persona );

El compilador Java es responsable de verificar que el mtodo pertenezca al tipo de dato declarado por la variable. El l intrprete Java es responsable bl de d identificar d f y ejecutar la implementacin del mtodo correspondiente al tipo de objeto referenciado en el momento por la variable.

Franco Guidi Polanco

25

Franco Guidi Polanco

26

Operador instanceof y herencia Todo objeto es instancia de la clase a la que pertenece, como tambin instancia de su superclase.

Operador instanceof: ejemplo


Suponer:
Persona p1 =null: Profesor p2 = new Profesor(); Alumno p3 = new Alumno(); if( p1 instanceof Persona ) --> false if( p2 instanceof Profesor ) --> true if( p3 3i instanceof t f Alumno Al ) --> true t if( p2 instanceof Alumno ) --> false if( p3 instanceof Persona ) --> true if( p2 instanceof Persona ) --> > true

Persona Electrodomstico

Lavadora

Un objeto de la clase lavadora es tambin un electrodomstico

Profesor

Alumno

Franco Guidi Polanco

27

Franco Guidi Polanco

28

Herencia y acceso a miembros de una clase


public class Persona { private String rut; private String nombre; public setDatos(String r r, String n) { rut = r; nombre = n; } public String getRut(){ return rut; } public String getNombre(){ return nombre; } } public class Alumno extends Persona { private String carrera; public String matricularse( String c){ carrera = c; } }

Herencia y acceso a miembros de una clase


public class Persona { private String rut; private String nombre; public setDatos(String r r, String n) { rut = r; nombre = n; } public String getRut(){ return rut; } public String getNombre(){ return nombre; } } public class Alumno extends Persona { private String carrera; public String matricularse( String c){ carrera = c; } }

Esto debe funcionar:


Persona a = new Persona(); a.setDatos( 1000-2, Luis); Alumno b = new Alumno(); b b.setDatos( tD t ( 2000 2000-3, 3 Pamela P l ) ); b.matricularse( Industrial );
Franco Guidi Polanco 29

Esto funciona?
Persona c = new Alumno(); c.setDatos( 1000-2, Luis); c.matricularse( Comercial );

Error: el compilador determina que este mtodo no pertenece a Persona. Sin embargo la variable contiene referencia a un Alumno, que es un tipo de Persona (y que posee este t mtodo). t d )

Franco Guidi Polanco

30

Herencia y acceso a miembros de una clase


public class Persona { private String rut; private String nombre; public setDatos(String r r, String n) { rut = r; nombre = n; } public String getRut(){ return rut; } public String getNombre(){ return nombre; } } public class Alumno extends Persona { private String carrera; public String matricularse( String c){ carrera = c; } }

Herencia y acceso a miembros de una clase El casting no convierte objetos, simplemente explicita el tipo de objeto referenciado en una variable.
Persona
Persona a = new Profesor(); Profesor b = (Profesor) a; // OK Alumno c = (Alumno) a; // ERROR

Es necesario introducir un casting para indicar al compilador que el objeto referenciado en la variable es efectivamente una instancia de Alumno: Persona c = new Alumno(); c setDatos( 1000-2 c.setDatos( 1000 2 , Luis); Luis ); ( (Alumno)c ).matricularse( Industrial );
Franco Guidi Polanco 31

Profesor

Alumno

Persona d = new Persona(); Profesor e = (Profesor) d; // ERROR Alumno f = (Alumno) d; // ERROR

Alumno g = new Alumno(); Profesor h = (Profesor) g; // ERROR

Franco Guidi Polanco

32

Miembros protegidos de una clase El modificador de visibilidad protected, permite declarar visibilidad protegida en variables de instancia y mtodos. Los miembros de una clase con visibilidad protegida son slo accesibles desde la misma clase o desde cualquier subclase de ella (no son accesibles desde otras clases) clases).

Miembros protegidos de una clase Por lo tanto, una subclase hereda de su superclase:
Variables de instancia protegidas y pblicas Mtodos protegidos y pblicos

Franco Guidi Polanco

33

Franco Guidi Polanco

34

Miembros protegidos de una clase Ejemplo:


public class Persona { protected String rut; protected String nombre; public Persona(String r r, String n) { rut = r; nombre = n; } public pub c void o d set setRut(String ut(St g r){ ){ rut = r; } public String getRut(){ return rut; } public void setNombre(String n){ nombre = n; } public String getNombre(){ return nombre; } } public class Alumno extends Persona { private String rolUCV; public bli Al Alumno() () { super( 000000-0, N/A ); rolUCV = 000000-0"; } public String quinSoy(){ return rut + nombre + rolUCV; } }

Identificacin de superclases
Contexto: se est desarrollando una aplicacin que trabaja con CDs, DVDs y discos de vinilo. Problema: se establece que a pesar de tener sus propios atributos, todos ellos disponen de cdigo, di sello ll discogrfico di fi y autor. t Se desea evitar duplicidad de cdigo. Decisin: se determina la conveniencia de crear la clase ProductoMusical, que agrupa las propiedades comunes de los tres tipos de productos.

ProductoMusical cdigo sello autor

CD

DVD

Vi il Vinilo

La superclase aparece por factorizacin de propiedades comunes


Franco Guidi Polanco 35 Franco Guidi Polanco 36

Clases abstractas
En el ejemplo anterior la clase ProductoMusical es abstracta (no representa entidades presentes en el dominio). Esta condicin se explicita en el diseo, diseo declarando la clase como abstracta. ProductoMusical {abstract} cdigo sello autor
public abstract class ProductoMusical { private int cdigo; private String sello; ... }

Clases abstractas Otro ejemplo: un software trabaja con distintas figuras geomtricas, todas ellas polgonos, con algunas propiedades en comn (ej. cantidad de lados).

Polgono

CD

DVD

Vinilo

Una clase abstracta no puede ser instanciada, instanciada ha sido diseada slo para ser extendida.
Franco Guidi Polanco 37 Franco Guidi Polanco 38

Clases abstractas
public abstract class Poligono { protected int lados; public void setLados(int l){ lados = l; } ... }

Mtodos abstractos
Supongamos que en el ejemplo anterior todos los polgonos deben proveer un mtodo de clculo de rea rea. Conflicto de fuerzas en diseo:
Todos los polgonos deben proveer el mtodo, por lo tanto debiese aparecer a nivel de la superclase Polgono. La operacin del mtodo depende de cada polgono concreto (ej. rea de cuagrado: lado2, rea de tringulo base * altura /2, etc.), por lo tanto no puede establecerse una lgica l i comn a nivel i l de d superclase. l

Polgono

Polgono

public class Cuadrado extends Poligono { private int longitud; public void setLongitud(double l) { longitud = l; } ... }
Franco Guidi Polanco 39

Solucin: declarar mtodo como abstracto abst acto e en la a supe superclase. c ase
Franco Guidi Polanco 40

Mtodos abstractos Un mtodo abstracto es un mtodo que se declara en una superclase, pero sin proveer implementacin. La implementacin de un mtodo abstracto se difiere para sus subclases. Una clase que declara uno o ms mtodos abstractos b es necesariamente abstracta b ( debe (y d b ser declarada como tal). Si una subclase b l no provee implementacin i l t i para un mtodo abstracto que hereda de su superclase, es necesariamente abstracta (y debe ser declarada como tal).
Franco Guidi Polanco 41

Mtodos abstractos
public abstract class Poligono { protected int lados; public int setLados(int l){ l d =l lados l; } public abstract double getArea(); ... }

Polgono

public class Cuadrado extends Poligono { private double longitud; public void setLongitud(double l) { longitud = l; } public double getArea(){ return longitud*longitud; } ... }
Franco Guidi Polanco

42

Consecuencias del uso de mtodos abstractos

Si una superclase declara algn mtodo abstracto, entonces:


Las subclases concretas deben implementarlo. Las variables de referencia declaradas del tipo de la superclase pueden recibir invocaciones al mtodo abstracto, , sin necesidad de casting. g Ejemplo:
Polgono figura = new Tringulo(); double sup = figura.getArea();
getArea() fue declarado como mtodo abstracto en Polgono.

Franco Guidi Polanco

43

You might also like