7/30/2019 HerencyPolim_PAvanz09
1/48
1
Herencia y Polimorfismo
Programacin Avanzada en Java
FCC BUAP 2009
Adaptado de UPM
7/30/2019 HerencyPolim_PAvanz09
2/48
2
Herencia en el mundo real
Medio de
transporte
Vehiculo areo
Objeto de
oficina
Cosa
Coche
Medio de tele-comunicacin
7/30/2019 HerencyPolim_PAvanz09
3/48
3
Introduccin La idea bsica es poder crear clases basadas en
clases ya existentes. Cuando heredamos de una clase existente,
estamos re-usando cdigo (mtodos y
campos). Podemos agregar mtodos y variables para
adaptar la clase a la nueva situacin.
Java tambin permite consultar por laestructura de una clase (cules son susmtodos y variables). A esto se le llama
reflexin.
7/30/2019 HerencyPolim_PAvanz09
4/48
4
Introduccin (cont.)
La herencia la identificamos cuandoencontramos la relacin es-un entre la nuevaclase y la ya existente. Un estudiante es una
persona. La clase ya existente se le llama superclase,
clase base , o clase padre.
A la nueva clase se le llama subclase, clasederivada, o clase hija.
7/30/2019 HerencyPolim_PAvanz09
5/48
5
Herencia en Java
Java permite definir unaclase como subclase de una
clase padre.classclase_hija extendsclase_padre{
//cuerpo de la clase
.........
}
Clase Padre
Clase Hija
7/30/2019 HerencyPolim_PAvanz09
6/48
6
Ejemplo de Herencia
+set_values()
#width
#height
Polygon
+area()
Rectangle
+area()
Triangle
class Polygon {protected int width, height;
public void set_values (int a, int b) {
width=a; height=b;} }
class Rectangle extends Polygon {
public int area() { return (width * height); } }
class Triangle extends Polygon {
public int area() { return (width * height / 2); }
public static void main(String[] args) {
Rectangle rect; Triangle trgl;
rect = new Rectangle(); trgl = new Triangle();
rect.set_values (4,5); trgl.set_values (4,5);
System.out.print("area" + rect.area() + '\n' +
trgl.area() + '\n');
}}
7/30/2019 HerencyPolim_PAvanz09
7/48
7
Constructores y Herencia
Cuando se declara un objeto de una clasederivada, se ejecutan los constructoressiguiendo el orden de derivacin, es decir,
primero el de la clase base, y despus losconstructores de las clases derivadas de arribaa abajo.
Para pasar parmetros al constructor de laclase padre:
super(para1, para2, ..., paraN)
7/30/2019 HerencyPolim_PAvanz09
8/48
8
Formato de la referencia super
Nombre_subclase (lista de parametros){
Super(lista de parmetros);
//Cuerpo del constructor de la subclase
}
7/30/2019 HerencyPolim_PAvanz09
9/48
9
Ejemplo de super
class Persona {private String nombre;private int edad;public Persona() {}public Persona (String n, int e)
{ nombre = n; edad = e; }}class Alumno extends Persona {
private int curso;private String nivelAcademico;public Alumno (String n, int e, int c, String nivel) {
super(n, e);curso = c; nivel_academico = nivel;}public static void main(String[] args) {
Alumno a = new Alumno("Pepe", 1, 2, "bueno");}
}
7/30/2019 HerencyPolim_PAvanz09
10/48
10
Redefinir funciones miembros de la
clase padreclass Persona {
private String nombre;private int edad;...................public String toString() { return nombre + edad; }
public void setEdad(int e) { edad = e; }}class Alumno extends Persona {
private int curso;private String nivelAcademico;
...................public String toString() {
return super.toString() + curso + nivelAcademico;
}
public void setCurso(int c) { curso = c; }
}
7/30/2019 HerencyPolim_PAvanz09
11/48
11
Referencias a objetos de claseshijas
Si tenemos ClaseHijo hijo = new ClaseHijo(...);
entonces es posiblepadre=hijo dondepadre es unavariable de tipo ClasePadre.pero no es posible!! hijo=padre (s que es posible con
casting hijo= (ClaseHijo) padre)
Ahora bien:Conpadre slo podemos acceder a atributos y mtodos
definidos en la clase padre.
7/30/2019 HerencyPolim_PAvanz09
12/48
12
Referencias a objetos de claseshijas
public static void main(String[] args) {Persona p;Alumno a = new Alumno(pepe,23,1,universitario);
p=a; //referecnia padre seala al objeto hijo// acceso al objeto hijo mediante la referencia padre
p.setEdad(24);/* no es posible acceder a un miembro de la clase hija usandouna ref a la clase padre*/
p.setCurso(88); // ERROR}
7/30/2019 HerencyPolim_PAvanz09
13/48
13
Ejemplo
class Persona { ................... }class Alumno extends Persona {
......................public String toString() {
return super.toString() + curso + nivelAcademico;
}}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;
}
}
bli t ti id i (St i [] ){
7/30/2019 HerencyPolim_PAvanz09
14/48
14
public static void main(String[] args){Dictionary webster = new Dictionary();
webster.message();
webster.defMessage();
}
public class Book {
protectedint pages = 1500;
public String message() {System.out.println(Number of pages: + pages);
}}
public class Dictionary extends Book {
private int definitions = 52500;
public void defMessage() {System.out.println(Number of definitions +
definitions);System.out.println(Definitions per page: +
(definitions/pages));}
}
Number of pages: 1500
Number of definitions: 52500
Definitions per page: 35
Otro Ejemplo
7/30/2019 HerencyPolim_PAvanz09
15/48
15
El permisoprotected
Los modificadores de visibilidad determina qumiembros de la clase son heredados y cules NO.
Variables y metodos declarados con el permiso publicson heredados, los declardos private NO.
Pero variables public violan el principio delencapsulamiento.
Existe un tercer permiso de acceso a los miembros deuna clase: protected T que ayuda a las situacionesde herencia
7/30/2019 HerencyPolim_PAvanz09
16/48
16
El permisoprotected
El protected modificador permite que unmiembro de una clase base sea heredado a unaclase hija.
El permiso protected provee:
mayor encapsulamiento que el permiso public.
Tel mejor encapsumiento que permite la herencia
7/30/2019 HerencyPolim_PAvanz09
17/48
17
Polimorfismo
Una misma llamada ejecuta distintas sentencias dependiendode la clase a la que pertenezca el objeto al que se aplica elmtodo.
Supongamos que declaramos:Persona p;
Podra suceder que durante la ej. del programa, p referencie aun profesor o a un alumno en distintos momentos, y Entonces:
Si p referencia a un alumno, con p.toString(), se ejecuta el toString dela clase Alumno.
Si p referencia a un profesor, con p.toString(), se ejecuta el toString de
la clase Profesor. Enlace dinmico: Se decide en tiempo de ejecucin qu
mtodo se ejecuta. OJO!: Sobrecarga de fs => enlace esttico (t. de compilacin).
7/30/2019 HerencyPolim_PAvanz09
18/48
18
Ejemplo de Polimorfismo
public static void main(String[] args) {Persona v[]=new Persona[10];
// Se introducen alumnos, profesores y personas en vfor (int i=0 ; i
7/30/2019 HerencyPolim_PAvanz09
19/48
19
Mtodos abstractos
Tenemos un mtodo f() aplicable a todos los objetos de laclase A. rea de un polgono.
La implementacin del mtodo es completamente diferente encada subclase de A. rea de un tringulo. rea de un rectngulo......................................
Para declarar un mtodo como abstracto, se pone delante lapalabra reservada abstracty no define un cuerpo:
abstract tipo nombreMtodo(....);
Luego en cada subclase se define un mtodo con la mismacabecera y distinto cuerpo.
7/30/2019 HerencyPolim_PAvanz09
20/48
20
Clases Abstractas
Si una clase contiene al menos un mtodoabstracto, entonces es una clase abstracta.
Una clase abstracta es una clase de la que no
se pueden crear objetos, pero puede serutilizada como clase padre para otras clases.
Declaracin:
abstract class NombreClase {..............
}
7/30/2019 HerencyPolim_PAvanz09
21/48
21
Ejemplo de clase abstracta
+toString() : String
+cambiarEdad()
-nombre-edad
persona
+cambiarCurso()
+toString() : String
+pagoMensual() : double
+mostrarAsignaturas()
-curso-nivelAcademico
alumno
+toString() : String
-asignaturaprofesor
-pedirAsignaturas()
+pagoMensual() : double
+mostrarAsignaturas()
-listaAsignaturas
-precioPorHora
-noHorasDiarias
libre
+pagoMensual() : double
+mostrarAsignaturas()
-matriculaCurso
-noConvocatoria
-plusPorConvocatoria
presencial
7/30/2019 HerencyPolim_PAvanz09
22/48
22
Ejemplo de clase abstracta
abstract class Alumno extends Persona {
protected int curso;private String nivelAcademico;public Alumno (String n, int e, int c, String nivel) {
super(n, e);
curso = c; nivelAcademico = nivel;}
public String toString() {return super.toString() + curso + nivelAcademico;
}
abstract double pagoMensual();abstract String getAsignaturas();
}
7/30/2019 HerencyPolim_PAvanz09
23/48
23
Ejemplo de clase abstracta
class Libre extends Alumno {private String []listaDeAsignaturas;private static float precioPorHora=10;private int noHorasDiarias;private void pedirAsignaturas() {}// se inicializa listaDeAsignaturas
public double pagoMensual() {return precioPorHora*noHorasDiarias*30; }
public String getAsignaturas() {
String asignaturas="";
for (int i=0; i
7/30/2019 HerencyPolim_PAvanz09
24/48
24
Ejemplo de clase abstracta
class Presencial extends Alumno {private double matriculaCurso;private double plusPorConvocatoria;private int noConvocatoria;public double pagoMensual()
{ return (matriculaCurso+plusPorConvocatoria*noConvocatoria)/12; }
public String getAsignaturas(){
return todas las del curso + curso;
}
public Presencial(String n, int e, int c, String nivel,double mc, double pc, int nc) {
super(n,e,c,nivel);matriculaCurso=mc;plusPorConvocatoria=pc;noConvocatoria=nc;
}}
7/30/2019 HerencyPolim_PAvanz09
25/48
25
Ejemplo de clase abstracta
// FUNCIONES GLOBALES
voidmostrarAsignaturas(Alumno v[]) {
for (int i=0; i
7/30/2019 HerencyPolim_PAvanz09
26/48
26
Interfaces
Podra suceder que los objetos de varias clases compartan lacapacidad de ejecutar un cierto conjunto de operaciones.
Y dependiendo de la clase de objeto, cada operacin se realicede diferente manera.
Ejemplo: Clases: Circulo, Elipse, Triangulo, .... Todas esas clases incluyen los mtodos: rea, perimetro,
cambiarEscala, etc.
Podramos definir una interfaz comn que agrupe todos losmtodos comunes (como mtodos abstractos).
Y luego definir varias clases de modo que implementen unamisma interfaz.
7/30/2019 HerencyPolim_PAvanz09
27/48
27
Ejemplo de Interfaz
public interface Figura {
abstract double area();
abstract double perimetro();
}
public class Circulo implements Figura {private double radio;private static double PI=3.1416;..............public double area() { return PI*radio*radio; }public double perimetro() { return 2*PI*radio; }
}
public class Cuadrado implements Figura {private double lado;..............public double area() { return lado*lado; }public double perimetro() { return 4*lado; }
}
7/30/2019 HerencyPolim_PAvanz09
28/48
28
Ejemplo de Interfaz
double totalArea(Figura v[]) {
double t=0;
for (int i=0; i
7/30/2019 HerencyPolim_PAvanz09
29/48
29
Interfaces
Design Abstraction and a way for
loosing realizing Multiple Inheritance
7/30/2019 HerencyPolim_PAvanz09
30/48
30
Interfaces
Interface is a conceptual entity similar to a Abstractclass.
Can contain only constants (final variables) and
abstract method (no implementation) - Different fromAbstract classes.
Use when a number of classes share a commoninterface.
Each class should implement the interface.
7/30/2019 HerencyPolim_PAvanz09
31/48
31
Interfaces: An informal way of
realising multiple inheritance An interface is basically a kind of classit contains
methods and variables, but they have to be onlyabstract classes and final fields/variables.
Therefore, it is the responsibility of the class thatimplements an interface to supply the code formethods.
A class can implement any number of interfaces, butcannot extend more than one class at a time.
Therefore, interfaces are considered as an informalway of realising multiple inheritance in Java.
7/30/2019 HerencyPolim_PAvanz09
32/48
32
Interface - Example
speak()
Politician Priest
Speaker
speak() speak()
Lecturer
speak()
7/30/2019 HerencyPolim_PAvanz09
33/48
33
Interfaces Definition
Syntax (appears like abstract class):
Example:
interface InterfaceName {// Constant/Final Variable Declaration// Methods Declaration only method body
}
interface Speaker {public void speak( );
}
7/30/2019 HerencyPolim_PAvanz09
34/48
34
Implementing Interfaces
Interfaces are used like super-classes whoproperties are inherited by classes. This isachieved by creating a class that implements
the given interface as follows:
class ClassName implements InterfaceName [, InterfaceName2, ]
{// Body of Class
}
7/30/2019 HerencyPolim_PAvanz09
35/48
35
Implementing Interfaces Example
class Politician implements Speaker {
public void speak(){System.out.println(Talk politics);
}}
class Priest implements Speaker {public void speak(){
System.out.println(Religious Talks);}
}
class Lecturer implements Speaker {public void speak(){
System.out.println(Talks Object Oriented Design and Programming!);}
}
7/30/2019 HerencyPolim_PAvanz09
36/48
36
Extending Interfaces
Like classes, interfaces can also be extended. Thenew sub-interface will inherit all the members of thesuperinterface in the manner similar to classes. This is
achieved by using the keyword extends as follows:
interface InterfaceName2 extendsInterfaceName1
{ // Body of InterfaceName2}
7/30/2019 HerencyPolim_PAvanz09
37/48
37
Inheritance and Interface
Implementation A general form of interface implementation:
This shows a class can extended another class whileimplementing one or more interfaces. It appears like a multiple
inheritance (if we consider interfaces as special kind of classeswith certain restrictions or special features).
class ClassName extends SuperClass implements InterfaceName [,InterfaceName2, ]
{ // Body of Class}
7/30/2019 HerencyPolim_PAvanz09
38/48
38
Student Assessment Example
Consider a university where students who participate in thenational games or Olympics are given some grace marks.Therefore, the final marks awarded = Exam_Marks +Sports_Grace_Marks. A class diagram representing this
scenario is as follow:
Student Sports
Exam
Results
extends
extendsimplements
7/30/2019 HerencyPolim_PAvanz09
39/48
39
Software Implementation
class Student{
// student no and access methods}interface Sport{
// sports grace marks (say 5 marks) and abstract methods}class Exam extends Student{
// example marks (test1 and test 2 marks) and access methods}class Results extends Exam implements Sport
{// implementation of abstract methods of Sport interface// other methods to compute total marks = test1+test2+sports_grace_marks;// other display or final results access methods
}
7/30/2019 HerencyPolim_PAvanz09
40/48
40
Interfaces and Software
Engineering Interfaces, like abstract classes and methods, provide
templates of behaviour that other classes are expected toimplement.
Separates out a design hierarchy from implementation
hierarchy. This allows software designers to enforce/passcommon/standard syntax for programmers implementingdifferent classes.
Pass method descriptions, not implementation Java allows for inheritance from only a single superclass.
Interfaces allow forclass mixing. Classes implementinterfaces.
7/30/2019 HerencyPolim_PAvanz09
41/48
41
Manejo de una excepcin
Supongamos que en una funcinfde Java sedetecta una situacin anmala, entonces:
Se ejecuta:thrownew NombreExcepcin([msg]);
Para que pueda ser capturada:try {// bloque try
f(...); // u otra func que llame a f.
}
7/30/2019 HerencyPolim_PAvanz09
42/48
42
Manejo de una excepcin
El tratamiento de la excepcin se especifica mediante unasentencia catch:
try {
f(...) // fuente de la excepcin
........
} catch (tipo_excepcion1 parmetro1) {tratamiento de la excepcin1
} catch (tipo_excepcion2 parmetro2) {
................................
} catch (tipo_excepcionN parmetroN) {
tratamiento de la excepcinN} [finally {
bloque que se ejecuta siempre
}]
7/30/2019 HerencyPolim_PAvanz09
43/48
43
Creacin de clases de Excepciones
class MiExcepcion extends Exception {
public MiException() { }
// si se quiere mostrar un cierto mensaje
// se debe definir este segundo constructor
public MiException(String msg) {
super(msg);}
}
Se debe definir una nueva clase subclase de laclase Exception.
7/30/2019 HerencyPolim_PAvanz09
44/48
44
Jerarqua de Excepciones
7/30/2019 HerencyPolim_PAvanz09
45/48
45
Igualdad y Asignacin entre
objetos El operador de asignacin no sirve para crear una copia de un objeto. Cmo crear una copia a nivel de bits?
Solucin: utilizar el mtodo clone(). Para poder utilizarlo con los objetos de una clase A, la clase A debe
implementar la interfaz Cloneable y se debe incluir el siguiente mtodoclone() en la clase A:
public Object clone(){
Object obj=null;
try{
obj=super.clone();
}catch(CloneNotSupportedException ex){System.out.println(" no se puede duplicar");
}
return obj;
}
7/30/2019 HerencyPolim_PAvanz09
46/48
46
Ejemplo con clone()
class Date implements Cloneable {....................public Object clone(){
Object obj=null;
try{
obj=super.clone();
}catch(CloneNotSupportedException ex){System.out.println(" no se puede duplicar");
}
return obj;
}
public static void main(String[] args) {Date ob1, ob2;
ob1 = new Date(12, 4, 96);ob2 = (Date) ob1.clone(); // ob2 es una copia de ob1// las alias de ob1 y ob2 son diferentesSystem.out.println(ob1 == ob2);// el contenido de ob1 y ob2 es el mismoSystem.out.println(ob1.equals(ob2));
}}
7/30/2019 HerencyPolim_PAvanz09
47/48
47
Problemas con el clone()
Si se quiere hacer una copia de un objeto quecontiene otros objetos, no sirve el clone() queproporciona Java.Ejemplo: clase Persona con un atributo fecha de
nacimiento.
Solucin: redefinir el mtodo clone() para la clase
Persona de modo que haga una copia del objetofecha de nacimiento.
7/30/2019 HerencyPolim_PAvanz09
48/48
48
Ejemplo con clone() redefinido
public class Persona implements Cloneable {private String nombre;private Date fechaNacimiento;public Persona(String nombre, Date fechaNacimiento){
this.nombre = nombre;
this.fechaNacimiento = fechaNacimiento;}public Object clone(){
return (new Persona(nombre, (Date) (fechaNacimiento.clone())));
}
public static void main(String[] args) {Persona p1, p2;p1 = new Persona("Pepe", new Date(1,1,2006));p2 = (Persona) p1.clone();
}}