You are on page 1of 32

Herencia y Polimorfismo

Fuente :Jaime Ramrez, ngel Lucas Gonzlez. DLSIIS. Facultad de Informtica ni!ersidad "olit#cnica de $adrid.
1

Herencia en el mundo real

Cosa

Medio de telecomunicacin Medio de transporte

Objeto de oficina Coche Vehiculo areo

Concepto de Herencia
% Los o&'etos se definen como miem&ros de clases. (onociendo la clase de un o&'eto se )uede tener muc*a informaci+n so&re el mismo. ,n )rogramaci+n orientada a o&'etos se )ueden definir clases -su&clases. en t#rminos de otras clases -su)erclases.. /oda su&clase *ereda el estado -en la forma de declaraci+n de !aria&les. 0 los m#todos de la su)erclase. Sin em&argo, las su&clases no estn limitadas al estado 0 com)ortamiento de su su)erclase. Las su&clases )ueden a1adir nue!as !aria&les miem&ros 0 nue!os m#todos a los *eredados de la su)erclase 0 dar im)lementaciones )articulares )ara los m#todos *eredados anulando la definici+n original de los m#todos dada )or la su)erclase.

Herencia en "a#a
% Ja!a )ermite definir una clase como su&clase de una clase )adre.
class clase_hija extends clase_padre { .......... }
Clase Padre

Clase Hija

%jemplo de Herencia
class Poly,on protected int +idth. hei,ht/ public #oid set'#alues (int a. int b) +idth0a/ hei,ht0b/1 1 class Rectangle extends Polygon public int area() - return (+idth 2 hei,ht)/ 1 1 class Triangle extends Polygon public int area() - return (+idth 2 hei,ht 3 2)/ 1 public static #oid main(4trin,56 ar,s) 7ectan,le rect/ 8rian,le tr,l/ rect 0 ne+ 7ectan,le()/ tr,l 0 ne+ 8rian,le()/ rect9set'#alues (!.$)/ tr,l9set'#alues (!.$)/ 4ystem9out9print(:area: & rect9area() & ;<n; & tr,l9area() & ;<n;)/ 11
$

Polygon *+idth *hei,ht &set'#alues()

Rectangle &area()

Triangle &area()

Constructores y Herencia
% (uando se declara un o&' de una clase deri!ada, se e'ecutan los conts siguiendo el orden de deri!aci+n, es decir, )rimero el de la clase &ase, 0 des)u#s los conts de las clases deri!adas de arri&a a a&a'o. % "ara )asar )armetros al constructor de la clase )adre:
super (para1, para2, ..., paraN)
=

%jemplo de super
class "ersona 2 )ri!ate String nom&re3 )ri!ate int edad3 )u&lic "ersona-. 24 public Persona (String n, int e) 2 nom&re 5 n3 edad 5 e3 4 4 class 6lumno e7tends "ersona 2 )ri!ate int curso3 )ri!ate String ni!el6cademico3 public Alumno (String n, int e, int c, String nivel) 2 super(n, e); curso 5 c3 ni!el8academico 5 ni!el3 4 )u&lic static !oid main-String9: args. 2 6lumno a 5 ne; 6lumno-<"e)e<, =, >, <&ueno<.3 4 4

>

7edefinir f9 miembros de la clase padre


class "ersona 2 )ri!ate String nom&re3 )ri!ate int edad3 ................... public String toString() { return nombre + edad; } )u&lic !oid set,dad-int e. 2 edad 5 e3 4 4 class 6lumno e7tends "ersona 2 )ri!ate int curso3 )ri!ate String ni!el6cademico3 ................... public String toString() { return super.toString() + curso + nivelAcademico; } )u&lic !oid set(urso-int c. 2 curso 5 c3 4 4

7eferencias a objetos de clases hijas


% Si tenemos ClaseHijo hijo = new ClaseHijo(...); % entonces es )osi&le padre=hijo donde padre es una !aria&le de ti)o ClasePadre.
? )ero no es )osi&le@@ hijo=padre (s Aue es )osi&le con casting hijo= (ClaseHijo) padre.

% 6*ora &ien:
? (on padre s+lo )odemos acceder a atri&utos 0 m#todos def. en la clase )adre.
@

7eferencias a objetos de clases hijas


)u&lic static !oid main-String9: args. 2 "ersona )3 6lumno a 5 ne; 6lumno-B)e)eC,>D,=,Cuni!ersitarioC.3 )5a3 EEref )adre se1ala al o&'eto *i'o EE acceso al o&'eto *i'o mediante la ref )adre ).set,dad->F.3 EG no es )osi&le acceder a un miem&ro de la clase *i'a usando una ref a la clase )adreGE ).set(urso-HH.3 EE ,RRIR 4
1A

%jemplo
class "ersona 2 ................... 4 class 6lumno e7tends "ersona 2 ...................... )u&lic String toString-. 2 return su)er.toString-. J curso J ni!el6cademico3 4 4 class Profesor extends Persona { private String asignatura; public Profesor (String n, int e, String asign) { super(n, e); asignatura asign; } public String toString() { return super.toString() + asignatura; } }
11

Polimorfismo
% na misma llamada e'ecuta distintas sentencias de)endiendo de la clase a la Aue )ertenezca el o&'eto al Aue se a)lica el m#todo. % Su)ongamos Aue declaramos: Persona p; % "odra suceder Aue durante la e'. del )rograma, ) referencie a un )rofesor o a un alumno en distintos momentos, 0 % ,ntonces:
? Si ) referencia a un alumno, con ).toString-., se e'ecuta el toString de la clase 6lumno. ? Si ) referencia a un )rofesor, con ).toString-., se e'ecuta el toString de la clase "rofesor.

% !nlace din"mico: Se decide en tiempo de e#ecuci$n Au# m#todo se e'ecuta. % IJI@: So&recarga de fs 5K enlace esttico -t. de com)ilaci+n..
12

%jemplo de Polimorfismo
)u&lic static !oid main-String9: args. 2 "ersona !9:5ne; "ersona9=L:3 EE Se introducen alumnos, )rofesores 0 )ersonas en ! for -int i5L 3 iM=L3 iJJ. EG Se )iden datos al usuario de )rofesor, alumno o )ersona GE s;itc* -ti)o. 2 case EG )rofesor GE: !9i: 5 ne; "rofesor -N..3 &reaO3 case EG alumno GE: !9i: 5 ne; 6lumno-N.3 &reaO3 case EG )ersona GE: !9i: 5 ne; "ersona-N.3 &reaO3 default: EG ,RRIR GE 4 4 for -int i5L 3 iM=L3 iJJ. S0stem.out.)rintln-v%i&); EE enlace dinmico con toString-. 1 4

Mtodos abstractos
% /enemos un m#todo f-. a)lica&le a todos los o&'etos de la clase 6.
? rea de un )olgono.

% La im)lementaci+n del m#todo es com)letamente diferente en cada su&clase de 6.


? rea de un tringulo. ? rea de un rectngulo. .....................................

% "ara declarar un m#todo como a&stracto, se )one delante la )ala&ra reser!ada a s!rac! 0 no define un cuer)o:
a s!rac! !ipo no" re#$!odo(....);

% Luego en cada su&clase se define un m#todo con la misma ca&ecera 0 distinto cuer)o.
1!

Clases Bbstractas
% Si una clase contiene al menos un m#todo a&stracto, entonces es una clase a&stracta. % na clase abstracta es una clase de la Aue no se )ueden crear o&'etos, )ero )uede ser utilizada como clase )adre )ara otras clases. % Declaraci+n:
a s!rac! class No" reClase { .............. }
1$

%jemplo de clase abstracta


persona -nombre -edad &to4trin,() C 4trin, &cambiar%dad()

alumno -curso -ni#elBcademico &cambiarCurso() &to4trin,() C 4trin, &pa,oMensual() C double &mostrarBsi,naturas() profesor -asi,natura &to4trin,() C 4trin,

libre -listaBsi,naturas -precioPorHora -noHorasDiarias -pedirBsi,naturas() &pa,oMensual() C double &mostrarBsi,naturas()

presencial -matriculaCurso -noCon#ocatoria -plusPorCon#ocatoria &pa,oMensual() C double &mostrarBsi,naturas()

1=

%jemplo de clase abstracta


abstract class Alumno extends Persona { )rotected int curso3 )ri!ate String ni!el6cademico3 )u&lic 6lumno -String n, int e, int c, String ni!el. 2 su)er-n, e.3 curso 5 c3 ni!el6cademico 5 ni!el3 4 )u&lic String toString-. 2 return su)er.toString-. J curso J ni!el6cademico3 4 abstract double pago'ensual(); abstract String getAsignaturas(); 4

1>

%jemplo de clase abstracta


class (ibre extends Alumno { )ri!ate String 9:listaDe6signaturas3 )ri!ate static float )recio"orPora5=L3 )ri!ate int noPorasDiarias3 )ri!ate !oid )edir6signaturas-. 24EE se inicializa listaDe6signaturas public double pago'ensual() { return precioPor)ora*no)oras+iarias*,-; } public String getAsignaturas() { String asignaturas ..; for (int i -; i/lista+eAsignaturas.lengt0; i++) asignaturas + lista+eAsignaturas%i& + 1 1; return asignaturas; } )u&lic Li&re-String n, int e, int c, String ni!el, int *oras. 2su)er-n,e,c,ni!el.3 noPorasDiarias 5 *oras3 )edir6signaturas-.3 4 4

1?

%jemplo de clase abstracta


class Presencial extends Alumno { )ri!ate dou&le matricula(urso3 )ri!ate dou&le )lus"or(on!ocatoria3 )ri!ate int no(on!ocatoria3 public double pago'ensual() { return (matricula2urso+plusPor2onvocatoria*no2onvocatoria)345; } public String getAsignaturas(){ return 6todas las del curso 6 + curso; } )u&lic "resencial-String n, int e, int c, String ni!el, dou&le mc, dou&le )c, int nc. 2 su)er-n,e,c,ni!el.3 matricula(urso5mc3 )lus"or(on!ocatoria5)c3 no(on!ocatoria5nc3 4 4
1@

%jemplo de clase abstracta


// FUNCIONES GLOBALES void mostrarAsignaturas(Alumno v[]) { for (int i !" i#v$l%ngt&" i'') S(st%m$out$)rintln(v[i]$g%tAsignaturas())" // %nla*% +in,mi*o double total.agos(Alumno v[]) { double t !" for (int i !" i#v$l%ngt&" i'') t ' v[i]$)ago/%nsual()" // %nla*% +in,mi*o return t" -

2A

Enterfaces
% Las interfaces Aue )ro)one Ja!a son e7)resiones )uras de dise1o. Se trata de aut#nticas conce)tualizaciones no im)lementadas Aue sim)lemente marcan una gua acerca de Au# es lo Aue *a0 Aue *acer, )ero no desarrollan un mecanismo de soluci+n. % Se trata de la manera de declarar m#todos a&stractos 0 constantes Aue )osteriormente )uedan ser im)lementados de diferentes maneras segQn las necesidades. % "or e'em)lo una misma interfaz )odra ser im)lementada en una !ersi+n de )rue&a de manera )oco +)tima, 0 ser acelerado con!enientemente en la !ersi+n definiti!a tras conocer ms a fondo el )ro&lema.
21

Enterfaces
% "odra suceder Aue los o&'etos de !arias clases com)artan la ca)acidad de e'ecutar un cierto con'unto de o)eraciones. % R de)endiendo de la clase de o&'eto, cada o)eraci+n se realice de diferente manera. % ,'em)lo:
? (lases: (irculo, ,li)se, /riangulo, .... ? /odas esas clases inclu0en los m#todos: rea, )erimetro, cam&iar,scala, etc.

% "odramos definir una interfaz comQn Aue agru)e todos los m#todos comunes -como m#todos a&stractos.. % R luego definir !arias clases de modo Aue im)lementen una misma interfaz.
22

%jemplo de EnterfaF
public interface 7igura { abstract double area(); abstract double perimetro(); } )u&lic class (irculo implements 7igura 2 )ri!ate dou&le radio3 )ri!ate static dou&le "I5D.=F=S3 .............. )u&lic dou&le area-. 2 return "IGradioGradio3 4 )u&lic dou&le )erimetro-. 2 return >G"IGradio3 4 4 )u&lic class (uadrado implements 7igura 2 )ri!ate dou&le lado3 .............. )u&lic dou&le area-. 2 return ladoGlado3 4 )u&lic dou&le )erimetro-. 2 return FGlado3 4 4
HHinterfaFII

Gi,ura
area() perimetro()

Cuadrado

Circulo

%jemplo de EnterfaF
% na interfaz )uede incluir tam&i#n definiciones de constantes a )arte de m#todos a&stractos. % na misma clase )uede im)lementar ms de una interfaz Perencia mQlti)le de interfaces % Se )ueden crear 'erarAuas de interfaces -con e7tends@@.. % Se )ueden declarar referencias a o&'etos Aue im)lementen una cierta interfaz.
double totalAr%a(Figura v[]) { double t !" for (int i !" i#v$l%ngt&" i'') t ' v[i]$ar%a()" // %nla*% +in,mi*o return t" -

2!

$ane'o de una e7ce)ci+n


% Su)ongamos Aue en una funci+n % de Ja!a se detecta una situaci+n an+mala, entonces: % Se e'ecuta:
!hrow new To" re&'cepci(n(["s)])3

% "ara Aue )ueda ser ca)turada:


!r* {++ lo,ue !r* %(...); ++ u o!ra %unc ,ue lla"e a %. }
2$

$ane'o de una e7ce)ci+n


% ,l tratamiento de la e7ce)ci+n se es)ecifica mediante una sentencia ca!ch!r* { %(...) ++ %uen!e de la e'cepci(n ........ } ca!ch (!ipo_e'cepcion1 par."e!ro1) { /!ra!a"ien!o de la e'cepci(n10 } ca!ch (!ipo_e'cepcion2 par."e!ro2) { ................................ } ca!ch (!ipo_e'cepcionN par."e!roN) { /!ra!a"ien!o de la e'cepci(nN0 } [ %inall* { / lo,ue ,ue se ejecu!a sie"pre0 }]
2=

(reaci+n de clases de ,7ce)ciones


Se de&e definir una nue!a clase su&clase de la clase ,7ce)tion.
% class #i&'cepcion e'!ends &'cep!ion { pu lic #i&'cep!ion() { } ++ si se ,uiere "os!rar un cier!o "ensaje ++ se de e de%inir es!e se)undo cons!ruc!or pu lic #i&'cep!ion(1!rin) "s)) { super("s)); } }
2>

"erarJuKa de %Lcepciones

2?

E,ualdad y Bsi,nacin entre objetos


% % ,l o)erador de asignaci+n no sir!e )ara crear una co)ia de un o&'eto. U(+mo crear una co)ia a ni!el de &itsV ? Soluci+n: utilizar el m#todo clone(). ? "ara )oder utilizarlo con los o&'etos de una clase 6, la clase 6 de&e im)lementar la interfaz Clonea le 0 se de&e incluir el siguiente m#todo clone-. en la clase 6:
pu lic 2 jec! clone(){ 2 jec! o j=null; !r*{ o j=super.clone(); }ca!ch(CloneNo!1uppor!ed&'cep!ion e'){ 1*s!e".ou!.prin!ln(3 no se puede duplicar3); } re!urn o j; }
2@

%jemplo con clone()


class Date implements 2loneable 2 .................... public 8b#ect clone(){ 8b#ect ob# null; tr9{ ob# super.clone(); }catc0(2lone:otSupported!xception ex){ S9stem.out.println(. no se puede duplicar.); } return ob#; } )u&lic static !oid main-String9: args. 2 Date o&=, o&>3 o&= 5 ne; Date-=>, F, WS.3 ob5 (+ate) ob4.clone(); EE o&> es una co)ia de o&= EE las alias de o&= 0 o&> son diferentes S0stem.out.)rintln-o&= 55 o&>.3 EE el contenido de o&= 0 o&> es el mismo S0stem.out.)rintln-o&=.eAuals-o&>..3 4 4

Problemas con el clone()


% Si se Auiere *acer una co)ia de un o&'eto Aue contiene otros o&'etos, no sir!e el clone-. Aue )ro)orciona Ja!a.
? ,'em)lo: clase "ersona con un atri&uto fec*a de nacimiento. ? Soluci+n: redefinir el m#todo clone-. )ara la clase "ersona de modo Aue *aga una co)ia del o&'eto fec*a de nacimiento.
1

%jemplo con clone() redefinido


)u&lic class "ersona implements 2loneable 2 )ri!ate String nom&re3 )ri!ate Date fec*aTacimiento3 )u&lic "ersona-String nom&re, Date fec*aTacimiento.2 t*is.nom&re 5 nom&re3 t*is.fec*aTacimiento 5 fec*aTacimiento3 4 public 8b#ect clone(){ return (ne; Persona(nombre, (+ate) (fec0a:acimiento.clone()))); } )u&lic static !oid main-String9: args. 2 "ersona )=, )>3 )= 5 ne; "ersona-<"e)e<, ne; Date-=,=,>LLS..3 p5 (Persona) p4.clone(); 4 4 2

You might also like