eda_tema_1_gmolto.pdf

15
Tema 1- Conceptos de Java para Estructuras de Datos Germán Moltó Escuela Técnica Superior de Ingeniería Informática Uni ersidad Politécnica de Valencia Universidad Politécnica de Valencia 1 Tema 1- Conceptos de Java para Estructuras de Datos Tema 1 Conceptos de Java para Estructuras de Datos Í Índice general : 1. Clases y Objetos en Java 2. El Principio de la Programación Orientada a Objetos de la Herencia y su Soporte en Java 3 El Polimorfismo en Java 3. El Polimorfismo en Java 4. Más Herencia en Java: Métodos y Clases Finales y Abstractos. 5. Herencia Múltiple: Interfaces Java 5. Herencia Múltiple: Interfaces Java 2 Objetivos y Bibliografía Objetivos y Bibliografía Objetivos: Conocer los conceptos básicos de la POO y su soporte en el lenguaje Java Aprender el concepto de Herencia en Java para afrontar el Aprender el concepto de Herencia en Java para afrontar el desarrollo de estructuras de datos y algoritmos que se realiza en temas posteriores. Estudiar el concepto de paquete como mecanismo para la Estudiar el concepto de paquete como mecanismo para la agrupación de clases. Comprender el concepto de Polimorfismo, Interfaz y Clase Ab í ilid d Abstracta, así como su utilidad. Bibliografía: Weiss M A Estructuras de datos en Java Adisson-Wesley 2000 Weiss, M.A. Estructuras de datos en Java. Adisson-Wesley , 2000. Capítulos 2 (Apartado 2.5) 3 y 4 Arnow, D., Weiss G. Introducción a la Programación con Java. Un f i td bj t Adi W l 2001 C ít l 14 3 enfoque orientado a objetos. Adisson-Wesley , 2001. Capítulo 14 Objetos y Clases en Java (I) Objetos y Clases en Java (I) En Java todo son objetos (i.e. instancias de una Clase dada), exceptuando los 8 tipos primitivos (i.e.byte, short, int, long, float, double, char y boolean). Una Clase consta de un conjunto de atributos (almacenan Una Clase consta de un conjunto de atributos (almacenan datos) y un conjunto de métodos (trabajan con esos datos). Un Objeto de una Clase se usa/manipula desde cualquier Un Objeto de una Clase se usa/manipula desde cualquier método de otra Clase, como por ejemplo TestClase. public class TestClase { public class TestClase { public static void main( String args[] ){ ... } } Ejemplo: sea TestCirculo una aplicación que maneja Círculos, ie Objetos de la clase Circulo 4 i.e. Objetos de la clase Circulo

Upload: cieloci

Post on 17-Dec-2015

232 views

Category:

Documents


0 download

TRANSCRIPT

  • Tema 1- Conceptos de Java para Estructuras de Datos

    Germn MoltEscuela Tcnica Superior de Ingeniera Informtica

    Uni ersidad Politcnica de ValenciaUniversidad Politcnica de Valencia

    1

    Tema 1- Conceptos de Java para Estructuras de DatosTema 1 Conceptos de Java para Estructuras de Datos

    ndice general:1. Clases y Objetos en Java2. El Principio de la Programacin Orientada a Objetos de la Herencia y

    su Soporte en Java3 El Polimorfismo en Java3. El Polimorfismo en Java4. Ms Herencia en Java: Mtodos y Clases Finales y Abstractos.5. Herencia Mltiple: Interfaces Java5. Herencia Mltiple: Interfaces Java

    2

    Objetivos y BibliografaObjetivos y Bibliografa Objetivos:

    Conocer los conceptos bsicos de la POO y su soporte en el lenguaje Java

    Aprender el concepto de Herencia en Java para afrontar el Aprender el concepto de Herencia en Java para afrontar el desarrollo de estructuras de datos y algoritmos que se realiza en temas posteriores.

    Estudiar el concepto de paquete como mecanismo para la Estudiar el concepto de paquete como mecanismo para la agrupacin de clases.

    Comprender el concepto de Polimorfismo, Interfaz y Clase Ab ilid dAbstracta, as como su utilidad.

    Bibliografa: Weiss M A Estructuras de datos en Java Adisson-Wesley 2000 Weiss, M.A. Estructuras de datos en Java. Adisson-Wesley, 2000.

    Captulos 2 (Apartado 2.5) 3 y 4 Arnow, D., Weiss G. Introduccin a la Programacin con Java. Un

    f i t d bj t Adi W l 2001 C t l 14

    3

    enfoque orientado a objetos. Adisson-Wesley, 2001. Captulo 14

    Objetos y Clases en Java (I)Objetos y Clases en Java (I) En Java todo son objetos (i.e. instancias de una Clase dada),

    exceptuando los 8 tipos primitivos (i.e. byte, short, int, long, float, double, char y boolean).

    Una Clase consta de un conjunto de atributos (almacenan Una Clase consta de un conjunto de atributos (almacenan datos) y un conjunto de mtodos (trabajan con esos datos).

    Un Objeto de una Clase se usa/manipula desde cualquier Un Objeto de una Clase se usa/manipula desde cualquier mtodo de otra Clase, como por ejemplo TestClase.

    public class TestClase {public class TestClase {public static void main( String args[] ){ ... }

    }

    Ejemplo: sea TestCirculo una aplicacin que maneja Crculos, i e Objetos de la clase Circulo

    4

    i.e. Objetos de la clase Circulo

  • Objetos y Clases en Java (II)Objetos y Clases en Java (II)

    public class TestClase {p {public static void main( String args[] ){

    ?}

    }

    Qu podemos hacer con un objeto? Especificacin de una Clase: descripcin de QU se puede

    hacer con un Objeto, es decir, qu mtodos expone (especificacin de Circulo).

    Implementacin de una Clase: detalles internos de CMO Implementacin de una Clase: detalles internos de CMO se satisface la Especificacin o cmo se consigue hacer lo que se hace con un Objeto.

    5

    Objetos y Clases en Java (III)Objetos y Clases en Java (III)

    public class TestClase {p {public static void main( String args[] ){

    Circulo c1 = new Circulo();Circulo c2;c2 = c1;}}

    }

    Creacin de Objetos de una Clase: c1 es una variable Referencia al nuevo Objeto creado. j c2 es una variable Referencia a ningn Objeto, i.e. tras la

    declaracin Circulo c2 ; c2 == null

    6

    Qu ocurre si se ejecuta c2 = c1; ?

    Referencias en JavaReferencias en Java Una variable Referencia almacena la direccin de memoria en

    la que se encuentra el Objeto al que referencia.

    0

    102 102c1

    408Circulo c1 = new Circulo();

    Memoria

    Circulo c1 new Circulo();

    Al hacer: Circulo c2 = c1; La variable referencia c2 pasa a tener el mismo valor que

    7

    c1, es decir, ambas apuntan al mismo objeto.

    Ejemplo de Utilizacin de Objetos CirculoEjemplo de Utilizacin de Objetos Circulo

    Podemos crear un objeto de la clase Circulo de la manera jespecificada en los constructores que define la clase.

    public class TestCirculo {p {public static void main( String args[] ){

    Circulo c1 = new Circulo();double radio = 4.0;Color color = Color.red;Circulo c2 = new Circulo(radio color);Circulo c2 = new Circulo(radio, color);System.out.println(c2);System.out.println(c2.toString());y p ( g());

    }}

    Qu diferencia hay en las dos ltimas invocaciones?

    8

    dos ltimas invocaciones?

  • Implementacin de una ClaseImplementacin de una Clase Implementacin de una Clase:

    Detalles internos de cmo se satisface la Especificacin o cmo se consigue hacer lo que se hace sobre un Objeto.

    Componentes de una Clase: Componentes de una Clase: Atributos, que almacenan los datos de la Clase Mtodos que definen la funcionalidad de la Clase mediante por lo Mtodos, que definen la funcionalidad de la Clase mediante, por lo

    general, la manipulacin de los atributos.

    Elementos que aparecen en la implementacin de una clase:q p p El operador this. Modificadores estticos, dinmicos y finales de una Clase y sus

    componentes. Modificadores de visibilidad public y private de una Clase y sus

    componentes

    9

    componentes.

    Implementacin de una Clase: Definicin de AtributosAtributos

    Los Atributos de una Clase almacenan los datos de la Clase Modelo de la relacin TIENE UN(A) Modificadores de atributosEj l d fi i i d l A ib d l Cl Ci l Ejemplo: definicin de los Atributos de la Clase Circuloprivate double radio;private String color;private String color;private static final double RADIO_POR_DEFECTO = 3.0;private static final Color COLOR_POR_DEFECTO = Color.black;

    Por lo general, los atributos se suelen definir privados y se definen mtodos consultores y modificadores. De esta manera se garantiza la encapsulacin u ocultacin de datosencapsulacin u ocultacin de datos.

    Modificador static: Permite definir variables a nivel de clase (compartidas por todos los objetos).

    10

    Modificador final: Impide asignar un nuevo valor al atributo.

    Implementacin de una Clase: Definicin de ConstructoresConstructores

    Los Constructores de una clase permiten dar un valor pinicial a los atributos del objeto. Ejemplo: definicin de los mtodos Constructores de Circulo

    public Circulo() {radio = RADIO_POR_DEFECTO;color = COLOR_POR_DEFECTO;

    }public Circulo(double radio Color color) {

    this hace referencia al objeto sobre el que se invoca el mtodo y sirve para evitar el aliasing de public Circulo(double radio, Color color) {

    this.radio = radio;this.color = color;

    }

    y p gnombres.

    }public Circulo(){

    this(RADIO_POR_DEFECTO, COLOR_POR_DEFECTO);

    11

    ( )}

    Implementacin de una Clase: Definicin de Mtodos (I)Mtodos (I) Los Mtodos de una clase definen su funcionalidad. Ejem l : Definicin de Mtodos Consultores en la clase Ejemplo: Definicin de Mtodos Consultores en la clase

    Circulo. Al definir como privados todos los atributos de Circulo, se deben

    i d d lproporcionar mtodos para acceder a su valor.

    public double getRadio() { Se podra utilizar this para referenciar a public double getRadio() {return radio;

    }

    p plos atributos (i.e., this.radio) pero no es necesario puesto que no hay aliasing de nombres.

    public Color getColor() {t lreturn color;

    }

    12

  • Implementacin de una Clase: Definicin de Mtodos (II)Mtodos (II)

    Al definir como privados todos los atributos de Circulo, pse deben proporcionar mtodos para modificar su valor.

    Ejemplo: definicin de los Mtodos Modificadores de Circulo

    public void setRadio(double nuevoRadio) {radio = nuevoRadio;

    }public void setColor(Color nuevoColor) {

    color = nuevoColor;}

    Utilizar diferentes nombres para el argumento y el atributo evita el aliasing y ya no es necesario utilizar this

    13

    ya no es necesario utilizar this.

    Implementacin de una Clase: Definicin de Mtodos (III)Mtodos (III)

    Ejemplo: definicin de otros Mtodos de Circuloj ppublic double area() { return Math.PI * radio * radio; }public String toString() {return Circulo de radio + radio}p g g() { }public static Circulo leerCirculo(Scanner teclado) { ... }

    El uso de un mtodo esttico permite definirlo a nivel de clase, no a nivel de instancia (objeto individual). Se deber invocar como Circulo.leerCirculo(...).

    Se podra utilizar this en la implementacin del mtodo area para referenciar al atributo radio?

    14

    referenciar al atributo radio?

    Estado Actual de la Clase CirculoEstado Actual de la Clase Circulopublic class Circulo {

    private double radio;private double radio;private Color color;private static final double RADIO_POR_DEFECTO = 3.0;private static final Color COLOR POR DEFECTO = Colorblack;private static final Color COLOR_POR_DEFECTO Color.black;

    /** crea un Circulo con radio r y color c */public Circulo(Color c double r) {public Circulo(Color c, double r) {

    this.color = c;this.radio = r;

    }}/** crea un Circulo estndar.: radio 3.0, color negro y centro en el origen*/public Circulo() {

    hi (COLOR POR DEFECTO RADIO POR DEFECTO)this(COLOR_POR_DEFECTO, RADIO_POR_DEFECTO);}

    }

    15

    }

    Ejercicios PropuestosEjercicios Propuestos Ejercicio 1: Escribe la clase Manzana que tiene un sabor, de tipo

    entero que representa una escala [0 10] entero que representa una escala [0,10]. Por defecto, la manzana tiene un sabor de 5, aunque se puede especificar

    su sabor al crearla. Ejercicio 2: En lugar de trabajar con Crculos, se desea trabajar con

    otro tipo de Figuras (Cuadrados o Rectngulos o Tringulos). Si ya se dispone de la aplicacin misCirculos, cmo se afrontara el p p diseo e implementacin de la nueva aplicacin?

    Ejercicio 3: Se desea realizar una aplicacin que maneje un grupo de Crculos En particular se desea:de Crculos. En particular, se desea: Construir el grupo con varios Circulos, mostrar el grupo por pantalla y

    obtener el rea del grupo.Siguiendo los pasos dados para la presentacin de la aplicacin misCirculos, desarrolla la aplicacin que maneje un grupo de Crculos (GrupoDeCirculos).

    16

    ( p )

  • Paquetes Java: Reutilizacin de CdigoPaquetes Java: Reutilizacin de Cdigo El mecanismo Java ms general para organizar un grupo de

    Cl d l l i l P tClases que guardan alguna relacin entre s es el Paquete Paquetes Java estndar

    java.lang : Contiene, entre otras, las clases Integer, Math, String y java.lang : Contiene, entre otras, las clases Integer, Math, String y System

    java.util : Contiene, entre otras, las clases Date, Random y StringTokenizerg

    java.io, java.awt (incluye la clase Color), etc. Manipulacin:

    l di ti i t l i bl d t CLASSPATH l la directiva import; la variable de entorno CLASSPATH; la instruccin package.

    Reglas de visibilidad dentro y fuera de un paquete. Es posible investigar los paquetes que incluye el API de Java

    mirando la documentacin: http://java sun com/javase/6/docs/api/

    17

    http://java.sun.com/javase/6/docs/api/

    Paquetes Java: Reglas de UtilizacinPaquetes Java: Reglas de Utilizacin

    La Clase C del Paquete p se especifica como p.Cq p p ppublic class MiClase(){

    ...j il D t f h j il D t ()java.util.Date fecha = new java.util.Date();...

    }

    Simplificacin: uso de la directiva import (antes de la declaracin de la clase).declaracin de la clase).

    import java.util.*;public class MiClase(){

    ...Date fecha = new Date();...

    18

    }

    Paquetes Java: Reglas de CreacinPaquetes Java: Reglas de Creacin Para indicar que una Clase C pertenece al Paquete p:

    la primera lnea del fichero C java es package p; la primera lnea del fichero C.java es package p; el fichero C.java debe estar en el subdirectorio p El subdirectorio p debe de encontrarse en la lista de la variable de

    entorno CLASSPATHentorno CLASSPATH

    Por ejemplo: La clase MiClase del paquete org.grycap.paquetedeber estar en la ruta:deber estar en la ruta: org/grycap/paquete/MiClase.java

    Para que el compilador/enlazador encuentre esa clase durante el proceso de compilacin el directorio debe estar incluido dentro de la lista de directorios de la variable de entorno CLASSPATH. Los IDEs (Entorno de Desarrollo Integrado) evitan tener que manipular

    de manera directa dicha variable. Ejemplo: HerramientasPreferenciasLibreras (BlueJ)

    19

    Paquetes Java: Reglas de VisibilidadPaquetes Java: Reglas de Visibilidad Los Paquetes tienen varias reglas de visibilidad importantes:

    1. Si una Clase o cualquiera de sus componentes no posee modificador de visibilidad alguno (public private o protected) slo modificador de visibilidad alguno (public, private o protected) slo es visible (puede ser referenciada) para las dems clases dentro del mismo Paquete. Esto se conoce como ACCESO FRIENDLY.

    2. Slo las clases pblicas de un paquete se pueden usar fuera de l

    3. Todas las clases que no forman parte de un paquete, pero se pueden alcanzar a travs de la variable CLASSPATH se consideran pparte del mismo paquete y el acceso amistoso se aplica entre ellas

    20

  • Ejercicio de Modificadores de VisibilidadEjercicio de Modificadores de Visibilidad

    package org.grycap.paquete;

    class Clase1{

    package org.grycap.otropaquete;

    import org.grycap.paquete.*;

    private int aPrivado;

    int otroAtributo;

    }

    public class Clase2{

    public static void main(String args[]){

    C C ()} Clase1 c1 = new Clase1();

    }} La creacin en Clase 2 es correcta?

    Clase 1 NO tiene modificador de package org.grycap.paquete;

    public class Clase3{visibilidad Acceso friendly (solo accesible desde clases del mismo paquete). Clase 2 pertenece a otro

    public static void main(String args[]){

    Clase1 c1 = new Clase1();

    p q ) ppaquete: org.grycap.paquete.Clase1 is not public in org.grycap.paquete; cannot be accessed from outside package.

    21

    }} Y la de Clase 3? Acceso Correcto

    Modificadores de Visibilidad: Tabla Resumen

    Modificadores de visibilidad aplicados tanto a una clase como pa cualquiera de sus miembros (atributos y mtodos).

    VisibilidadModificador

    Clase Paquete Subclase Mundo

    private S No No No

    ninguno S S No Noninguno S S No No

    protected S S S No

    public S S S S

    22

    Reutilizacin de Cdigo: Tipo de Relacin y Mecanismo Java

    Mecanismo Java para representar una Relacin entre Clases Mecanismo Java para representar una relacin

    P tExiste alguna relacin entre las clases, aunque no realicen la misma funcionalidad.

    Paquete

    Ejemplos: Clases de java.util, javax.swing, etc.javax.swing, etc.

    Existe una relacin TIENE UN(A) o Definicin de Atributos

    relacin de composicin entre las Clases Ejemplos: Circulo y grupoCirculos

    Herencia JavaExiste una relacin relacin ES UN(A) o relacin jerrquica entre las Clases

    Herencia JavaEjemplos: clase base Figura y sus derivadas Circulo, Rectangulo, ...

    23 Ejercicio de Persona

    Herencia en Lenguajes de POO y su Soporte en Javaen Java

    Introduccin al concepto de Herencia y su soporte en p y pJava. En particular, se incidir en los siguientes aspectos: Caractersticas y sintaxis de la Herencia en Javay J La clase Object y el modelo de jerarqua de Clases Java Caractersticas de una clase derivada

    Modificadores de visibilidad. Constructores de la derivada.

    S Sobrescritura de mtodos.

    Ejemplos: Diseo de la clase Figura y reformulacin de Ci l d d i d Di d l Circulo para que sea una de sus derivadas. Diseo de la clase GrupoDeFiguras.

    24

  • La relacin ES UN(A)La relacin ES UN(A)

    Si X ES UN(A) Y,( ) se dice que la Clase derivada X es una variacin de la Clase base Y se dice que X e Y forman una Jerarqua: X Y, donde la Clase X es

    una subClase de Y e Y es una superClase de X la relacin es transitiva: si X ES UN(A) Y e Y ES UN(A) Z, entonces

    X ES UN(A) ZX ES UN(A) Z

    Ejemplo: Qu relacin guardan Y (Base) Ejemplo: Qu relacin guardan entre s un cuadrado, un tringulo, un

    crculo y un rectngulo?

    Y (Base)

    y g

    X (Derivada)

    25

    Ejemplo de relacin ES UN(A)Ejemplo de relacin ES UN(A) Jerarqua de clases de figuras:

    Objeto Un crculo ES UNA figura Un rectngulo ES UNA figura

    Objeto

    Un cuadrado ES UN Rectngulo Figura

    Crculo Rectngulo

    Cuadrado La Herencia permite modelar una relacin de tipo ES UNrelacin de tipo ES UN.

    Permite definir una jerarqua de clases.

    26

    El Mecanismo de la HerenciaEl Mecanismo de la Herencia La Herencia permite la formacin de Y (Base)

    Jerarquas de Clases para reutilizar cdigo. X hereda (puede referenciar) todos los

    Y (Base)

    atributos y mtodos que no sean privados en Y.

    X (Derivada)

    X es una clase completamente nueva e independiente. Los cambios que sufra X NO afectan a Y, lo que simplifica el

    mantenimiento del cdigo.

    X es de tipo compatible con Y. Una referencia de tipo Y es polimrfica. Sin embargo, no son

    compatibles ni Y con X, ni X con sus clases hermanas.

    27

    Herencia: Sintxis bsica de JavaHerencia: Sintxis bsica de Javapublic class Derivada extends Base{

    }

    Los atributos y mtodos no privados de Base se heredan en Derivada (salvo los constructores). Esto significa que dichos atributos pueden ser referenciados y

    dichos mtodos pueden ser invocados.

    Usos del operador super: Referenciar a cualquier componente de Base (atributos,

    d ) mtodos o constructores), aunque no es muy comn. Se suele utilizar para invocar constructores de la clase padre y

    en casos de sobreescritura parcial de mtodos

    28

    en casos de sobreescritura parcial de mtodos.

  • Ejemplo Bsico de HerenciaEjemplo Bsico de Herenciapublic class Animal{ public class Leon extends Animal {

    protected String queHablo;public Animal(){

    queHablo = Groar!;

    public Leon(){queHablo = Grawl!;

    }queHablo = Groar! ; }public String rugir(){

    }}

    return queHablo; }}

    public class TestLeon {public static void main (String args[]){

    Qu saca por pantalla este cdigo?

    Leon l = new Leon();System.out.println(l.rugir());

    }

    este cdigo?

    29

    }}

    Herencia: Mtodos Constructores de una Clase DerivadaClase Derivada La clase Derivada debe definir explcitamente sus propios

    constructoresconstructores. En caso contrario, Java proporciona el constructor por defecto:

    public Derivada(){()super();

    } Constructor por defecto:

    Invoca al constructor sin parmetros de base (inicializando los atributos heredados de Base) y luego inicializando al valor por defecto a los atributos heredados de Derivada.

    Implicaciones: Si la clase Base NO define un constructor por defecto (sin Si la clase Base NO define un constructor por defecto (sin

    argumentos), la clase Derivada obligatoriamente deber definir un constructor que invoque al de la clase Base con los argumentos correspondientes.

    30

    correspondientes.

    Ejemplo: Definicin de ConstructoresEjemplo: Definicin de Constructores Constructores de la clase Figura:

    public Figura(Color c, String t) {this.color = c; this.tipo = t; }public Figura(){ this(COLOR POR DEFECTO, TIPO POR DEFECTO); }p g (){ ( _ _ , _ _ ); }

    Constructores de la clase Circulo, en base a los de la clase Figura:

    public Circulo(Color c, double r){super(c, "Circulo");this.radio = r;;

    }

    public Circulo() {super(); // No es necesaria ya que se realiza automticamente.this.radio = RADIO_POR_DEFECTO;

    }

    31

    }

    Ejercicio: Modificadores de Visibilidad Ejercicio: Modificadores de Visibilidad public class Base{

    bli i t bP bli t t d i t bP t id i t i t bPrivadopublic int bPublico; protected int bProtegido; private int bPrivado;} public class Derivada extends Base{

    bli i dP bli i i dP i dpublic int dPublico; private int dPrivado;} public class Test {

    public static void main(String args[]){Base b = new Base();Derivada d = new Derivada();System out println(b bPublico + " " + b bProtegido + " " + b bPrivado);System.out.println(b.bPublico + + b.bProtegido + + b.bPrivado);System.out.println(d.dPublico + " " + d.dPrivado);

    }} // NOTA: Se asume que todas las clases pertenecen al mismo paquete.} // NOTA: Se asume que todas las clases pertenecen al mismo paquete.

    1. En el main de Test, Qu accesos son incorrectos?2. Si main fuera un mtodo de Base, Qu accesos seran incorrectos?

    32

    2. Si main fuera un mtodo de Base, Qu accesos seran incorrectos?3. Si main fuera un mtodo de Derivada, Qu accesos seran incorrectos?

  • Herencia en Java: Sobrescritura de un mtodo de la Clase Basemtodo de la Clase Base Cualquier mtodo no privado de Base que se defina de

    nuevo en derivada se sobrescribe. Para ello, definimos en Derivada un mtodo:

    Con la misma signatura que en Base (nombre del mtodo y lista de parmetros).

    Con el mismo tipo de resultado que en Base. Sin aadir excepciones a lista de throws del mtodo definido en

    BaseBase.

    Sobreescritura parcial: C d d bi l t t l Cuando no se desea cambiar completamente el

    comportamiento del mtodo de la clase Base. Se utiliza super para invocar el mtodo de la clase Base.

    33

    p

    Ejemplo de sobrescritura del mtodo toString de Figura en la clase Circulo (I)toString de Figura en la clase Circulo (I) La clase Object es la raz de la jerarqua de herencia en

    Java Cualquier clase hereda implcitamente de la clase Object

    Mtodo toString(): Especificacin: public String toString(); Imlementacin: [Object.java]

    Mtodo toString de la clase Figura (sobrescritura del mtodo definido en Object): public String toString(){

    return Figura de tipo + tipo + color + color + centro + centro;

    }}34

    Ejemplo de sobrescritura del mtodo toString de Figura en la clase Circulo (II)toString de Figura en la clase Circulo (II) Mtodo toString en la clase Circulo (sobrescritura del

    mtodo definido en Figura) public String toString(){

    return Circulo de radio + radio + color + color + centro + centro; }}

    Mtodo toString en la clase Circulo (sobrescritura parcial d l t d d fi id Fi )del mtodo definido en Figura) public String toString(){

    ret rn s er t Strin () + radi + radi ;return super.toString() + y radio + radio;}

    35 Ejercicio de Yogures

    Ejemplo de Sobreescritura: EqualsEjemplo de Sobreescritura: Equals El mtodo equals est definido e implementado en la

    clase Object Permite decidir si dos referencias (objetos) son iguales. Criterio por defecto: Dos referencias son iguales si apuntan

    exactamente al mismo objeto.

    El i i d difi d bj d El criterio puede ser modificado para objetos de una clase sobreescribiendo el mtodo equals (Ej. Figura):

    R l fil ( b ) d l d l Respetar el perfil (cabecera) del mtodo equals Modificar criterio atendiendo a los atributos de la clase.

    bli b l l (Obj t ){public boolean equals(Object x){Figura f = (Figura) x;return (color.equals(f.color) && tipo.equals(f.tipo));

    }

    36

    }

  • Polimorfismo en JavaPolimorfismo en Java El polimorfismo es una consecuencia directa de la Herencia:

    Una variable referencia de una clase Base puede referenciar a Una variable referencia de una clase Base puede referenciar a objetos tanto de la clase Base como de cualquier clase Derivada de esta.

    Toda variable referencia tiene siempre dos tipos: Toda variable referencia tiene siempre dos tipos: Tipo esttico:

    El tipo con el que ha sido declarada la variable (nunca vara) Tipo dinmico:

    El tipo del objeto al que referencia en tiempo de ejecucin (puede variar) Si ambos tipos no coinciden, entonces la variable es polimrfica.p p

    Ejemplo: Figura f = new Rectangulo(); La variable f es polimrfica: La variable f es polimrfica:

    Tipo esttico: Figura Tipo dinmico: Rectngulo

    37

    Enlace DinmicoEnlace Dinmico Ante situaciones de sobreescritura de mtodos, el mtodo a

    j l d fi id l i di i d l i bl ejecutar es el definido por el tipo dinmico de la variable polimrfica.

    Se aplica en tiempo de ejecucin, previa comprobacin del p p j , p pacceso en la clase del tipo esttico.

    CClaseBase

    +miMetodo()

    ClaseBase cb = new ClaseDerivada();cb.miMetodo();

    ClaseDerivada

    +miMetodo()

    Se ejecutar el cdigo de miMetododefinido en ClaseDerivada.

    38

    ()

    Jerarqua de Clases: FigurasJerarqua de Clases: Figuras

    Object

    Figura

    Circulo

    +radio()

    Rectngulo

    Cuadrado+radio()

    39

    Ejemplo de Polimorfismo: Enlace DinmicoEjemplo de Polimorfismo: Enlace Dinmico

    public class TestPolimorfismo {public class TestPolimorfismo {public static void main (String args[]) {Figura f = new Circulo();System.out.println(Radio del Circulo: + f.radio());

    }

    cannot resolve symbol - method radio

    El compilador nicamente considera el tipo esttico de la variable para comprobar el acceso:p p El mtodo radio no est definido en la clase Figura. Error en

    tiempo de compilacin. A l ti di i d f Ci l

    40

    Aunque el tipo dinmico de f sea Circulo.

  • Ejemplo de Polimorfismo: Conversin de Restriccin (I)Restriccin (I)

    public class TestPolimorfismo {public static void main (String args[]) {Figura f = new Circulo();System.out.println(Radio del Circulo: + ( (Circulo) f ).radio());y p ( ( ( ) ) ())

    }}

    Ya que f es de tipo dinmico Circulo, podemos realizar un casting a tipo Circulo y, posteriormente, invocar el g p y, p ,mtodo radio. El operador casting () permite transformar una referencia de

    i i lun tipo a otro equivalente. Si el tipo destino NO es equivalente (i.e. ((Cuadrado) f) ),

    entonces se produce la excepcin ClassCastException.

    41

    entonces se produce la excepcin ClassCastException.

    Ejemplo de Polimorfismo: Conversin de AmpliacinAmpliacin

    public class TestPolimorfismo {public static void main (String args[]) {Figura f = new Circulo();System.out.print(f);y p ( )

    }

    System.out.println invocar al mtodo toString de f, que originalmente est definido en la clase Object aunque ha g j qsido sobrescrito en la clase Figura (y luego en Circulo). Se produce una conversin de ampliacin.

    El enlace dinmico garantiza que se ejecutar el correspondiente mtodo de la clase Circulo.

    42

    Ejemplo de Polimorfismo: Conversin de Restriccin (II)Restriccin (II)

    public class TestPolimorfismo {public static void main (String args[]) {Figura f = new Circulo();Circulo c = f;

    }}

    Aunque el tipo dinmico de f sea Circulo, al realizar la ltimaasignacin, el compilador indica que incompatible types -f C found Figura but expected Circulo. El compilador nicamente tiene en cuenta los tipos estticos para

    b l i i tcomprobar que las asignaciones son correctas.

    La asignacin se debera realizar de la siguiente manera:Ci l (Ci l ) f

    43

    Circulo c = (Circulo) f;

    Comprobacin de Tipo Dinmico: Operador instanceofinstanceof Mostrar por pantalla slo aquellos elementos que son de tipo

    Circulo, adems de cuntos hay (se asume que hay un vector C cu o, a e s e cu tos ay (se asu e que ay u vecto de Figuras ya inicializado correctamente):

    public class TestPolimorfismo {pFigura coleccion[];

    public static void main (String args[]) {System.out.println("Cuntos Crculos hay en la coleccin?");int numCirculos = 0;for(int i=0; i

  • Ejercicio de Herencia y PolimorfismoEjercicio de Herencia y Polimorfismo Dada la jerarqua de herencia,

    Qu instrucciones son correctas y cuales no?SerVivo

    +vive()

    1. SerVivo sv = new Humano();2. Humano hu = new Humano();

    ()

    Animal Vegetal3. Vegetal vg = new GiraSol();4. sv.razona();

    g

    GiraSolHumano5. sv.vive(); 6. hu.razona(); 7 hu = vg;

    GiraSol

    Vi

    Humano+razona()

    +vive()7. hu = vg; 8. sv = vg;

    seresVivos

    45

    Restringiendo la Especializacin: FinalRestringiendo la Especializacin: Final Empleando la palabra clave final Los atributos, mtodos y las clases pueden ser declaradas

    como finales. Atributo final: Representa una constante cuyo valor no puede ser Atributo final: Representa una constante cuyo valor no puede ser

    modificado. Mtodo final: Impide que el mtodo sea sobreescrito en alguna clase

    descendiente. Clase final: No pueden tener subclases, representa una hoja dentro

    del rbol de jerarqua de herencia. El uso de final genera cdigo ms eficiente ya que no se El uso de final genera cdigo ms eficiente ya que no se

    utiliza enlace dinmico y la llamada se resuelve en tiempo de compilacin.

    46

    Clases Abstractas (I)Clases Abstractas (I) Cmo obligar a que todas las clases derivadas deban

    f i l d i d d ? forzosamente implementar un determinado mtodo? Empleando la palabra clave abstract

    bli b t t l Fi { public abstract class Figura { protected String tipo;protected Color color;public Figura(String nombre){....}public abstract double area();...

    }

    public class Circulo extends Figura { ...public double area(){ return Math.PI * radio * radio;}...

    47

    }

    Clases Abstractas (II)Clases Abstractas (II)public class Rectangulo extends Figura {

    ...public double area(){ return base * altura;}...

    }

    public class Cuadrado extends Rectangulo { ...//No hace falta redefinir el mtodo area...

    La clase Cuadrado hereda la implementacin del mtodo area de la

    }

    La clase Cuadrado hereda la implementacin del mtodo area de la clase Rectngulo. No es necesario cambiar la implementacin y, por lo tanto, no hace falta redefinir el mtodo.

    48

  • Clases Abstractas (III)Clases Abstractas (III) Una clase abstracta

    Tiene al menos un mtodo abstracto, etiquetado como tal. Debe ser etiquetada por el programador como abstracta. N d i t i d ( l d ) No puede ser instanciada (va el operador new). Su(s) constructor(es) pueden ser utilizados (va super) Puede ser utilizada para definir referencias polimrficas de la clase.p p

    Una subclase de una clase abstracta puede: Implementar todos los mtodos abstractas Puede ser instanciada No implementar los mtodos abstractos Sigue siendo abstracta

    Utilizacin de estas clases: C d i bli l b l t i t Cuando se quiere obligar a que las subclases tengan un cierto

    comportamiento Ejemplo estndar de Clase abstracta: Number

    49

    j p

    Clase Abstracta: La clase Figura (I)Clase Abstracta: La clase Figura (I)package lasFiguras;import java.awt.*; //Para poder referenciar la clase Colorpublic abstract class Figura { // extends Object

    protected String tipo; protected String tipo; protected String color; protected static final String TIPO_POR_DEFECTO = "Circulo";protected static final Color COLOR_POR_DEFECTO = Color.black;

    public Figura(Color c String t){ public Figura(Color c, String t){ this.tipo = t; this.color = c;

    }public Figura(){

    this(TIPO_POR_DEFECTO, COLOR_POR_DEFECTO);}

    50

    }

    Clase Abstracta: La clase Figura (II)Clase Abstracta: La clase Figura (II)public boolean equals(Object x){

    Figura f = (Figura) x;return (colorequals(f color) && tipo equals(f tipo));return (color.equals(f.color) && tipo.equals(f.tipo));

    }

    public abstract double area();

    } //Fin de la clase Figura

    Para qu sirven los constructores de una clase abstracta si no se

    puede instanciar?} //Fin de la clase Figura puede instanciar?

    51

    La Clase RectanguloLa Clase Rectangulopublic class Rectangulo extends Figura {

    protected double base;protected double altura;

    public Rectangulo(Color c, double b, double a){( R t l ) thi b = b thi lt = super(c, Rectngulo); this.base = b; this.altura = a;

    }public Rectangulo (){public Rectangulo (){this(Color.black, 10.0, 10);}}public double area(){ return base * altura;}...

    52}

  • Interfaces en JavaInterfaces en Java En ocasiones es necesario que una clase herede de ms de una

    superclase: superclase: Herencia Mltiple

    Java slo permite que una clase herede explcitamente, va Java slo permite que una clase herede explcitamente, va extends, de una nica superclase (distinta de Object).

    En ocasiones es necesario imponer a una clase una funcionalidad genrica que no posee Object.

    Para ello, se debe definir una superclase especial, slo con mtodos abstractos por lo que forzosamente todas sus mtodos abstractos, por lo que forzosamente todas sus subclases los deben implementar si quieren dejar de ser abstractas.

    53

    Interfaces en Java: CaractersticasInterfaces en Java: Caractersticas Una Interfaz

    Consta slo de perfiles de mtodos que indican qu hace la clase Consta slo de perfiles de mtodos que indican qu hace la clase (especificacin) pero sin implementacin.

    Permite especificar un comportamiento genrico.

    Para poder imponer el comportamiento que describe: Sus mtodos son pblicos y abstractos, por lo que han de ser Sus mtodos son pblicos y abstractos, por lo que han de ser

    forzosamente implementados por sus subclases. Se dice que una clase implementa un interfaz.

    Sus atributos son pblicos y finales, por lo que NO tiene p y , p qconstructores ni puede ser instanciada, PERO s se pueden definir variables Referencia (polimrficas) del interfaz.

    Una subclase puede implementar todas las interfaces que quiera.

    54

    Interfaces en Java: Sintaxis y UtilizacinInterfaces en Java: Sintaxis y Utilizacin Sintaxis de Interfaces:

    Uso de la palabra clave interface en lugar de class. Se asume que los mtodos son public y abstract.

    public interface MiInterfaz {public interface MiInterfaz {int metodoQueImplementar(Object o);

    } En las subClases del interfaz, se aade a su cabecera implements

    bli l MiCl i l t MiI t f {public class MiClase implements MiInterfaz {...public int metodoQueImplementar(Object o){public int metodoQueImplementar(Object o){

    /* Implementacion del mtodo */ }

    Qu ocurrira si MiClase implementa el interfaz pero no

    55

    } proporciona cdigo al mtodo?

    Ejemplo de Interfaces (I)Ejemplo de Interfaces (I)

    Ejemplo de uso de interfaces:j p Forzar a que las clases proporcionen una descripcin de ellas.

    public interface Describible { p {String getDescripcion();

    }

    public class Libro implements Describible { ...

    public String getDescripcion(){p g g p (){return Este objeto es un libro;

    } ...

    }

    Si se aaden nuevos mtodos al interfaz, debern ser implementados en , plas correspondientes clases.56

  • Ejemplo de Interfaces (II)Ejemplo de Interfaces (II)

    Una clase Java puede implementar varias interfaces.J p ppublic interface Estudioso {

    Conocimiento estudia(Conceptos c);}

    public interface Trabajador { Dinero trabaja(Tareas t);

    }} }

    public class EstudianteTrabajador implements Estudioso, Trabajador{ public Conocimiento estudia(Conceptos c){

    //Implementacin}}public Dinero trabaja(Tareas t){

    //Implementacin}}

    }

    Es posible que tener referencias de tipo interfaz que sean polimrficas, i.e.: p q p q p ,Estudioso e = new EstudianteTrabajador();

    57

    Extensin de InterfacesExtensin de Interfaces

    Una Interfaz A puede extender de otra interfaz B.p Implementar la interfaz A requiere dar cdigo a todos los

    mtodos de A (los de A y los heredados de B).

    public interface OrdenadorPortable extends Ordenador{ float capacidadBateria();

    }}

    public interface Ordenador{ d d ()void encender();

    }

    bli l PDA i l O d d P t bl {public class PDA implements OrdenadorPortable{float capacidadBateria() { }void encender(){ }

    }58

    Uso Alternativo de InterfacesUso Alternativo de Interfaces Una interfaz tambin suele ser utilizada para agrupar

    constantes.public interface DiasSemana{

    int LUNES = 1 , MARTES = 2;String [] NOMBRE DIAS = { "Lunes" , "Martes"};String [] NOMBRE_DIAS { Lunes , Martes };

    }

    bli l Mi Di i l Di Spublic class MisDias implements DiasSemana{public int metodo(){p (){

    System.out.println(NOMBRE_DIAS[LUNES]);}

    }

    59

    }