HerencyPolim_PAvanz09

download HerencyPolim_PAvanz09

of 48

Transcript of HerencyPolim_PAvanz09

  • 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();

    }}