java poo 4 herencia
TRANSCRIPT
-
POO en Java IV: HerenciaPOO en Java IV: Herencia
Franco Guidi PolancoEscuela de Ingeniera Industrial
Pontificia Universidad Catlica de Valparaso, Chilef d @ [email protected]
Actualizacin: 17 de noviembre de 2010
Herencia
Es la derivacin de una clase a partir de otra existente.El objetivo es la reutilizacin del software
desarrollado.
HerenciaHerencia
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 cargaSuperclaseClase baseClase padre
Camin
Clase padre
SubclaseClase derivada
La herencia aplica en relaciones de naturaleza B es un
Camin Clase derivadaClase hija
Franco Guidi Polanco 3
La herencia aplica en relaciones de naturaleza B es un tipo de A
Herencia simple
Una clase es subclase de una nica superclase.
Vehculos de carga
C iCamin
Franco Guidi Polanco 4
-
Herencia mltiple
Una clase es subclase de ms de una superclase.
Vehculos t t
Vehculos titerrestres acuticos
Vehculos anfibios
Java no soporta la herencia mltiple.
Franco Guidi Polanco 5
Jerarquas de Herencia
La herencia organiza clases bases y derivadas
Pen jerarquas de clases.Una subclase hereda
Persona
propiedades de la respectiva superclase.
b l d
Alumno Profesor
Una subclase, respecto de su superclase:
Agrega nuevas propiedades
Profesorhora
Alumnopregrado
Alumno magster
Agrega nuevas propiedades Modifica propiedades
heredadas
Franco Guidi Polanco 6
Implementacin de jerarquas de herencia
Ejemplo:
Persona Atributos:- RUTOperaciones:
-set y get RUT- RUT- Nombre
-set y get RUT- set y get Nombre
AlumnoAtributos:
- RUTOperaciones:
-set y get RUTAlumno- Nombre- Rol UCV
- set y get Nombre- set y get Rol UCV
Franco Guidi Polanco 7
Implementacin de jerarquas de herencia
Para crear una subclase a partir de una superclase, la subclase debe declararse:
public class NombreSubclase extends NombreSuperclase
Franco Guidi Polanco 8
-
Implementacin de jerarquas de herencia
public class Persona { public class Alumno extends Persona {public class Persona {private String rut;private String nombre;
public class Alumno extends Persona {private String rolUCV;public Alumno() {
public Persona() {rut = "00000000-0";nombre = ""; }
public void setRut(String r){t }
rolUCV = 000000-0";}public void setRolUCV(String r){
rolUCV = r; }bli St i tR lUCV(){rut = r; }
public String getRut(){return rut; }
public void setNombre(String n){nombre = n; }
public String getRolUCV(){return rolUCV; }
}nombre = n; }
public String getNombre(){return nombre; }
}
Franco Guidi Polanco 9
Superclase Subclase
Miembros heredados
Una subclase hereda de su superclase (por el momento): Variables de instancia pblicas Mtodos pblicos
Todos los anteriores pueden ser utilizados en la b l i h bi id d l dsubclase como si hubieran sido declarados en
ella.
Franco Guidi Polanco 10
Miembros no heredados
Una subclase no hereda: Propiedades privadasPropiedades privadas Constructores
Sin embargo es posible hacer un uso indirecto de ellos Variables definidas Invocacin al constructor de la superclase.
Franco Guidi Polanco 11
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 Se dice que estas variables se encuentran definidas en la subclase.
Franco Guidi Polanco 12
-
Miembros no heredados: Variables definidas (cont.)
Ejemplo incorrecto:public class Persona { public class Alumno extends Persona {
Variables definidas en Alumnopublic class Persona {private String rut;private String nombre;
public class Alumno extends Persona {private String rolUCV;public Alumno() {
public Persona() {rut = "00000000-0";nombre = ""; }
public void setRut(String r){t }
rolUCV = 000000-0";}public void setRolUCV(String r){
rolUCV = r; }bli St i tR lUCV(){rut = r; }
public String getRut(){return rut; }
public void setNombre(String n){nombre = n; }
public String getRolUCV(){return rolUCV; }
public String quinSoy(){return rut + nombre + rolUCV;nombre = n; }
public String getNombre(){return nombre; }
}
return rut + nombre + rolUCV;}
}
Franco Guidi Polanco 13
Error: no pueden ser accesadas directamente
Miembros no heredados: Variables definidas (cont.)
Ejemplo correcto:public class Persona { public class Alumno extends Persona {public class Persona {private String rut;private String nombre;
public class Alumno extends Persona {private String rolUCV;public Alumno() {
public Persona() {rut = "00000000-0";nombre = ""; }
public void setRut(String r){t }
rolUCV = 000000-0";}public void setRolUCV(String r){
rolUCV = r; }bli St i tR lUCV(){rut = r; }
public String getRut(){return rut; }
public void setNombre(String n){nombre = n; }
public String getRolUCV(){return rolUCV; }
public String quinSoy(){return getRut() + getNombre()nombre = n; }
public String getNombre(){return nombre; }
}
return getRut() + getNombre()+ rolUCV;
}}
Franco Guidi Polanco 14
Esto s funciona
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 primerainstruccin 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 sinautomticamente 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 laconstructor 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 class Alumno extendsPersona {
private String rolUCV;public Alumno() {
rolUCV = 000000-0";}
public Alumno() {super();rolUCV = 000000-0";
}public void setRolUCV(String r){
rolUCV = r; }public String getRolUCV(){
return rolUCV; }
}public void setRolUCV(String r){
rolUCV = r; }public String getRolUCV(){
return rolUCV; }public String quinSoy(){
return getRut() + getNombre() + rolUCV;
}
public String quinSoy(){return getRut() + getNombre()
+ rolUCV;}
Franco Guidi Polanco 17
}}
}}
Constructores y herencia
Qu pasa en este caso?public class Persona {private String rut;private String nombre;
public class Alumno extendsPersona {
private String rolUCV;public Persona(String r, String n) {
rut = r;nombre = n;
}
public Alumno() {super( 000000-0, N/A );rolUCV = 000000-0";
}}public void setRut(String r){
rut = r; }public String getRut(){
return rut; }
}public void setRolUCV(String r){
rolUCV = r; }public String getRolUCV(){
public void setNombre(String n){nombre = n; }
public String getNombre(){return nombre; }
return rolUCV; }public String quinSoy(){
return getRut() + getNombre() l
Franco Guidi Polanco 18
}+ rolUCV;
}}
Constructores y herencia: Atencin!
Qu pasa en el siguiente caso?public class Persona {private String rut;private String nombre;
public class Alumno extendsPersona {
private String rolUCV;public Persona(String r, String n) {
rut = r;nombre = n;
}
public Alumno() {rolUCV = 000000-0";
}}public void setRut(String r){
rut = r; }public String getRut(){
return rut; }
public void setRolUCV(String r){rolUCV = r; }
public String getRolUCV(){return rolUCV; }
public void setNombre(String n){nombre = n; }
public String getNombre(){return nombre; }
public String quinSoy(){return getRut() + getNombre()
+ rolUCV;}
Franco Guidi Polanco 19
}}
}
Herencia: la verdad total
En Java toda clase extiende otra clase.Las clases que no declaran extender a otras,Las clases que no declaran extender a otras,
extienden a la clase Object.Object es la superclase (directa o indirecta) de j p ( )
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
superclase.
-
Sobreescritura de mtodos
Un mtodo declarado e implementado en una sperclase puede ser reimplementado en una subclase. Esto se d i b it d t ddenomina sobreescritura de mtodos.
Conceptualmente significa que la subclase realiza la operacin de la sper clase, pero de un modo distinto.operacin de la sper clase, pero de un modo distinto.
Esto es un caso de polimorfismo. public class Persona {
i S ipublic class Alumno extends
P {private String rut;private String nombre;public String getRut(){
return rut; }public String getNombre(){
Persona {private String carrera;
public String identificarse(){public String getNombre(){return nombre; }
public String identificarse(){return rut + nombre;
}
public String identificarse(){return getRut() + getNombre()
+ carrera;}
Franco Guidi Polanco 21
}//otros miembros de la clase}
//otros miembros de la clase}
Sobreescritura de mtodos
public class Persona {private String rut, nombre;public Persona(String r, String n){
rut = r; nombre = n;
public class Alumno extendsPersona {
private String carrera;public Alumno(String r, String ; ;
}public String getRut(){ return rut;}public String getNombre(){
return nombre;}
p ( g , gn, String c){
super(r,n); carrera = c;}public String identificarse(){
public String identificarse(){return rut + nombre;
}}
return getRut() + getNombre() + carrera;
}}
Qu ocurre en las siguientes situaciones?Persona a new Persona(100 Matas)Persona a = new Persona(100, Matas);System.out.println( a.identificarse() ); Alumno a = new Alumno(100, Matas, Ind);S t t i tl ( id tifi () )
100Matas
100M t I d
Franco Guidi Polanco 22
System.out.println( a.identificarse() ); 100MatasInd
Sobreescritura de mtodos
public class Persona {private String rut, nombre;public Persona(String r, String n){
rut = r; nombre = n;
public class Alumno extendsPersona {
private String carrera;public Alumno(String r, String ; ;
}public String getRut(){ return rut;}public String getNombre(){
return nombre;}
p ( g , gn, String c){
super(r,n); carrera = c;}public String identificarse(){
public String identificarse(){return rut + nombre;
}}
return getRut() + getNombre() + carrera;
}}
Y qu ocurre aqu?Persona a = new Alumno( 100, Matas, Ind);System.out.println( a.identificarse() );
Franco Guidi Polanco 23
Sobreescritura de mtodos
public class Persona {private String rut, nombre;public Persona(String r, String n){
rut = r; nombre = n;
public class Alumno extendsPersona {
private String carrera;public Alumno(String r, String ; ;
}public String getRut(){ return rut;}public String getNombre(){
return nombre;}
p ( g , gn, String c){
super(r,n); carrera = c;}public String identificarse(){public String identificarse(){
public String identificarse(){return rut + nombre;
}}
return getRut() + getNombre() + carrera;
}}
return getRut() + getNombre() + carrera;
}
Y qu ocurre aqu?Persona a = new Alumno( 100, Matas, Ind);System.out.println( a.identificarse() );
100MatasInd
Franco Guidi Polanco 24
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.
-
Sobreescritura de mtodos
Persona a = new Alumno( 100, Matas, Ind);System.out.println( a.identificarse() );
El compilador Java es responsable de verificar que el mtodo pertenezca al tipo de dato declarado por la variable.l bl d d fEl intrprete Java es responsable de identificar y
ejecutar la implementacin del mtodo correspondiente al tipo de objeto referenciado encorrespondiente al tipo de objeto referenciado en el momento por la variable.
Franco Guidi Polanco 25
Reconocimiento de clases: operador instanceof
El operador instanceof permite reconocer la clase a la que pertenece un objeto referenciado desde unala que pertenece un objeto referenciado desde una variable determinada.Formato:Formato:
NombreVar instanceof NombreClaseEjemplo:Ejemplo:
if( pers instanceof Persona )System.out.println( La variable pers referencia a una Persona );y p ( p );
elseSystem.out.println( La variable pers no referencia a una Persona );
Franco Guidi Polanco 26
Operador instanceof y herencia
Todo objeto es instancia de la clase a la que pertenece, como tambin instancia de supertenece, como tambin instancia de su superclase.
Electrodomstico
Lavadora
Un objeto de la clase lavadora es tambin un electrodomstico
Franco Guidi Polanco 27
Operador instanceof: ejemplo Suponer:
Persona
Persona p1 =null:Profesor p2 = new Profesor();Alumno p3 = new Alumno();
Profesor Alumno
if( p1 instanceof Persona ) --> falseif( p2 instanceof Profesor ) --> trueif( 3 i t f Al ) tProfesor Alumno if( p3 instanceof Alumno ) --> trueif( p2 instanceof Alumno ) --> falseif( p3 instanceof Persona ) --> trueif( p2 instanceof Persona ) > trueif( p2 instanceof Persona ) --> true
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 String n) {
public class Alumno extendsPersona {
private String carrera;public setDatos(String r, String n) {rut = r;nombre = n; }
public String getRut(){return rut; }
private String carrera;
public String matricularse(String c){
carrera = c;public String getNombre(){
return nombre; }}
}
}
Persona a = new Persona(); Esto debe funcionar:Persona a new Persona();a.setDatos( 1000-2, Luis);Alumno b = new Alumno();b tD t ( 2000 3 P l )
Franco Guidi Polanco 29
b.setDatos( 2000-3, Pamela );b.matricularse( Industrial );
Herencia y acceso a miembros de una clase
public class Persona {private String rut;private String nombre;public setDatos(String r String n) {
public class Alumno extendsPersona {
private String carrera;public setDatos(String r, String n) {rut = r;nombre = n; }
public String getRut(){return rut; }
private String carrera;
public String matricularse(String c){
carrera = c;public String getNombre(){
return nombre; }}
}
}
Esto funciona? Error: el compiladordetermina que este mtodo no pertenece a Persona. SinPersona c = new Alumno(); no pertenece a Persona. Sin embargo la variable contiene referencia a un Alumno, que es un tipo de Persona (y que posee
t t d )
Persona c new Alumno();c.setDatos( 1000-2, Luis);c.matricularse( Comercial );
Franco Guidi Polanco 30
este mtodo).
Herencia y acceso a miembros de una clase
public class Persona {private String rut;private String nombre;public setDatos(String r String n) {
public class Alumno extendsPersona {
private String carrera;public setDatos(String r, String n) {rut = r;nombre = n; }
public String getRut(){return rut; }
private String carrera;
public String matricularse(String c){
carrera = c;public String getNombre(){
return nombre; }}
}
}
Es necesario introducir un casting para indicar al compilador que el objeto referenciado en la variable es efectivamente una instancia de Alumno:efectivamente una instancia de Alumno:
Persona c = new Alumno();c setDatos( 1000-2 Luis);
Franco Guidi Polanco 31
c.setDatos( 1000 2 , Luis );( (Alumno)c ).matricularse( Industrial );
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; // OKAlumno c = (Alumno) a; // ERROR
Profesor Alumno Persona d = new Persona();Profesor e = (Profesor) d; // ERRORAlumno 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 claseo desde cualquier subclase de ella (no son accesibles desde otras clases)accesibles desde otras clases).
Franco Guidi Polanco 33
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 34
Miembros protegidos de una clase
Ejemplo:public class Persona { public class Alumno extendsprotected String rut;protected String nombre;public Persona(String r String n) {
Persona {private String rolUCV;bli Al () {public Persona(String r, String n) {
rut = r;nombre = n;
}public void setRut(String r){
public Alumno() {super( 000000-0, N/A );rolUCV = 000000-0";
}pub c o d set ut(St g ){
rut = r; }public String getRut(){
return rut; }public void setNombre(String n){
public String quinSoy(){return rut + nombre
+ rolUCV;}
nombre = n; }public String getNombre(){
return nombre; }}
}
Franco Guidi Polanco 35
}
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 di ll di fi t ProductoMusicalcdigo, sello discogrfico y autor.
Se desea evitar duplicidad de cdigo.
ProductoMusicalcdigosello autor Decisin: se determina la
conveniencia de crear la clase ProductoMusical, que agrupa las propiedades comunes de los tres Vi ilDVDCD
autor
propiedades comunes de los tres tipos de productos. ViniloDVDCD
Franco Guidi Polanco 36
La superclase aparece por factorizacin de propiedades comunes
-
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 declarando la clase como Esta condicin se explicita en el diseo, declarando la clase como abstracta.
ProductoMusical public abstract class ProductoMusical {ProductoMusical{abstract}
cdigosello
private int cdigo;private String sello;
sello autor
...}
Una clase abstracta no puede ser instanciada ha sido diseada slo
ViniloDVDCD
Una clase abstracta no puede ser instanciada, ha sido diseada slo para ser extendida.
Franco Guidi Polanco 37
Clases abstractas
Otro ejemplo: un software trabaja con distintas figuras geomtricas, todas ellas polgonos, con
algunas propiedades en comn (ej. cantidad de lados).
Polgono
Franco Guidi Polanco 38
Clases abstractas
public abstract class Poligono {protected int lados;public void setLados(int l){public void setLados(int l){
lados = l;}...
Polgono
}
public class Cuadrado extends Poligono {private int longitud; public void setLongitud(double l) {public void setLongitud(double l) {
longitud = l;}...
Franco Guidi Polanco 39
}
Mtodos abstractos
Supongamos que en el ejemplo anterior todos los polgonos deben proveer un mtodo de clculo de reaproveer un mtodo de clculo de rea.
Conflicto de fuerzas en diseo: Todos los polgonos deben proveer el
Polgono
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
l i i l d luna lgica comn a nivel de superclase.
Solucin: declarar mtodo como abstracto en la superclase.abst acto e a supe c ase
Franco Guidi Polanco 40
-
Mtodos abstractos
Un mtodo abstracto es un mtodo que se declaraen 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
b b ( d babstractos es necesariamente abstracta (y debe ser declarada como tal).Si b l i l t iSi una subclase no provee implementacin para un
mtodo abstracto que hereda de su superclase, es necesariamente abstracta (y debe ser declaradanecesariamente 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 llados = l;}public abstract double getArea();...Polgono
}
public class Cuadrado extends Poligono {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:abstracto, entonces: Las subclases concretas deben implementarlo. Las variables de referencia declaradas del tipo Las variables de referencia declaradas del tipo
de la superclase pueden recibir invocaciones al mtodo abstracto, sin necesidad de casting. , gEjemplo:
Polgono figura = new Tringulo(); getArea() fuePolgono figura new Tringulo();
double sup = figura.getArea();
getArea() fue declarado como mtodo abstracto en Polgono.
Franco Guidi Polanco 43