ProgII_Unidad3_transparencias

download ProgII_Unidad3_transparencias

If you can't read please download the document

description

#UPMRules

Transcript of ProgII_Unidad3_transparencias

  • Programacin II Diapositiva 1

    Programacin II

    Unidad 3: Elementos avanzados del lenguaje de

    programacin Java.

    Autor: Programacin II

    DTE/ETSIST/UPM

  • Programacin II Diapositiva 2

    Unidad 3: Elementos avanzados del lenguaje de

    programacin Java.

    3.1. Herencia.

    3.2. Polimorfismo.

    3.3. Clases abstractas e interfaces.

    3.4. Excepciones.

    3.5. Paquetes.

    ndice

  • Programacin II Diapositiva 3

    Programacin II

    3.1. Herencia

  • Programacin II Diapositiva 4

    La herencia es una de las principales capacidades de la POOy permite la

    reutilizacin y extensibilidad de software.

    Cuando se crea una clase se puede crear nuevos miembros. Tambin

    podemos designar que estos se heredan de una clase ya existente, para a

    continuacin modificarlos o aadirle nuevos elementos.

    En Java la clase ya existente se denomina superclase (clase padre) y la

    nueva clase que la extiende se denomina subclase (clase hijo).

    Es fcil confundir la relacin es-un (herencia) con la relacin tiene-un

    (composicin).

    Herencia

  • Programacin II Diapositiva 5

    Declaracin de una subclase utilizando herencia:

    public class Subclase extends SuperClase {

    /* cdigo */

    }

    Reglas:

    Una clase slo puede heredar de una nica superclase de forma directa (herencia

    simple).

    Si una clase no hereda explcitamente de otra, por defecto heredar de la clase

    java.lang.Object (herencia de jerarqua nica).

    Una subclase hereda los atributos y mtodos de su superclase, y de todas sus

    ancestros, hasta llegar a Object.

    Una subclase puede aadir nuevos elementos (atributos/mtodos). Tambin puede

    modificar (tapar/re -escribir) elementos heredados.

    Sintaxis de herencia

  • Programacin II Diapositiva 6

    Jerarqua de clases

    Las relacionesde herencia dan lugar a una jerarqua de clases:

  • Programacin II Diapositiva 7

    Dada la clase Punto (con coordenadas (x, y) y mtodos), cmo crear la clase

    Pixel (un punto con coordenadas (x, y) y un color)?

    Ejemplo

    public classPunto {

    private int x, y; //atributos

    // mtodos

    Punto ();

    public int getX() { return x ; }

    public int getY() { return y ; }

    public void mover(int x, int y) { this.x=x; this.y=y; }

    }

  • Programacin II Diapositiva 8

    UML Java

    Ejemplo de Pixel que hereda de Punto

    public classPixel extends Punto {

    private int color;

    public Pixel (int x, int y, int color){ }

    public int getColor() { return color; }

    }

    public classPunto {

    private int x, y;

    public Punto (int x, int y) { this.x= 0, this.y=0);

    public double getX() { return x ; }

    public double getY() { return y ; }

    public void mover(int x, int y) { this.x=x; this.y=y; }

    }

    Punto-x : double

    -y : double

    +getX() : double

    +getY() : double

    +mover(int,int)

    Pixel-color : int

    +getColor() : int

  • Programacin II Diapositiva 9

    La subclase Pixel:

    Tiene acceso a las atributos y mtodos de la superclase (Punto)

    declarados: public y protected.

    No tiene acceso a los declarados private.

    Adems, si est en el mismo paquete que la superclase puede

    acceder a los miembros (atributos y mtodos) sin modificador.

    Control de acceso en la herencia

  • Programacin II Diapositiva 10

    Una subclase puede volver a declarar una variable ya definida

    (tapado) volver a codificar un mtodo ya codificado

    (sobrescritura). Los mtodos declarados con final en la superclase

    no pueden ser sobreescritospor la superclase.

    Sobrescritura del mtodo mover en la subclase Pixel

    Sobreescritura

    public class Pixel extends Punto {

    private int color;

    public int getColor() { return color; }

    // mtodos (sobreescritos)

    public void mover ( int x, int y) { /* cdigo nuevo*/ }

    }

  • Programacin II Diapositiva 11

    La palabra reservada super se utiliza para referirse a la clase

    inmediatamente superior en la jerarqua de herencia (solo un nivel) y

    acceder a sus atributos y mtodos en caso de ambigedad.

    super

    public classPixel extends Punto {

    private int color;

    public int getColor() { return color; }

    // mtodos (sobreescritos)

    public void mover( int x, int y) {

    if (x >= 0 && y >=0)

    super.mover(x,y);

    }

    }

  • Programacin II Diapositiva 12

    Las clases heredadas quedan absorbidas. Cuando se instancia un objeto

    se instancia toda la jerarqua. Cada objeto se encarga de instanciar a su

    superclase y as sucesivamente.

    Pixel pixel = new Pixel() ;

    Pixel adems de exponer sus mtodos y atributos, aade los atributos y

    mtodos heredados de Punto y los que ste hereda de Object.

    Pixel hereda toda la funcionalidad de la clase Punto, a su vez, Punto

    hereda toda la funcionalidad de Object.

    La herencia en la instanciacin

    Object

    PixelPunto

  • Programacin II Diapositiva 13

    Los constructores no se heredan. Si no se indica nada automticamente al ejecutar

    un constructor se llamar al constructor sin parmetros de la superclase. Se

    puede indicar en la primera lnea del constructor con la llamada super() a qu

    constructor de la superclase se desea llamar (los parmetros permiten distinguirlo):

    public class Punto {

    private double x,y ;

    public Punto( int x, int y) { // super() por defecto

    this.x = x; this.y = y;

    }

    }

    public class Pixel extends Punto {

    private int color;

    public Pixel( int x, int y, int color) {

    super ( x,y ); // en la primera linea

    this.color = color;

    }

    }

    Constructores

  • Programacin II Diapositiva 14

    Programacin II

    3.2. Polimorfismo

  • Programacin II Diapositiva 15

    El polimorfismo en Java permite a travs de una referencia a un tipo

    de objeto manejar objetos de ese tipo o de cualquiera de sus

    subclases relacionados a travs de herencia (vlido con clases e

    interfaces).

    Por tipo nos referimos a la clase especificada o cualquiera de sus

    subclases

    Polimorfismo

    Punto punto ;

    Pixel pixel = new Pixel();

    punto = pixel; // Un pixel es - un punto

    punto.getX (); // OK

    punto.getColor (); // NOK

    Punto

    Pixel

  • Programacin II Diapositiva 16

    Tambin podemos hacer asignaciones hacia abajo

    (downcasting) pero se necesita un moldeado para

    compilar. En ejecucin puede generar un error al intentar

    utilizarlo si el objeto moldeado no es del tipo al que se ha

    convertido.

    Polimorfismo

    Punto punto = new Punto();

    Pixel pixel ;

    pixel = punto; // Error de compilacin

    pixel = (Pixel) punto;

    // Error en ejecucin (si no es verdad)

    OK?

    Punto

    Pixel

  • Programacin II Diapositiva 17

    Si en tiempo de ejecucin necesitamos determinar si un objeto

    es de un cierto tipo, podemos usar el operador instanceof. Por

    ejemplo, esto puede ser necesario para hacer el moldeado al

    tipo correcto.

    if (punto instanceof Pixel) {

    Pixel pixel = (Pixel) punto; // Ser correcto

    int color= pixel.getColor ();

    }

    Operador instanceof

  • Programacin II Diapositiva 18

    El polimorfismo influye en la forma en que se resuelve la llamada a un

    mtodo en ejecucin. El mtodo que se ejecuta depende del tipo del

    objeto referenciado en ese momento.

    Asociacin dinmica

    public void actualizar( Figura []

    figuras ) {

    for (i=0 ; i < figuras.length ;

    i++)

    figuras[i] .dibujar();

    /* Se sabr en ejecucin a qu tipo

    de objeto estamos invocando

    }

  • Programacin II Diapositiva 19

    La clase Object es la raz de la jerarqua de clases de Java. Todas las

    clases son descendientes de esta clase (directa o indirectamente).

    Proporciona un cierto nmero de mtodos de utilidad general que

    heredarn todos los objetos:

    Compararse uno mismo con otro objeto.

    Convertir a un Stringcadena legible caractersticas del estado del

    objeto.

    Clase java.lang.Object

  • Programacin II Diapositiva 20

    Compararse uno mismo con otro objeto:

    boolean equals (Object o)

    Se utiliza este mtodo para comparar si dos objetos son iguales.

    (Las referencias se comparan con ==).

    En las subclases se debe sobreescribir correctamente para

    comparar los objetos. Ejemplo:

    String uno = new String

    String dos = new String

    if ( uno.equals (dos) )

    System.out.println Cadenas son iguales

    else

    System.out.println

    if (uno==dos) // Se comparan referencias y devuelve false

    ....

    Clase java.lang.Object

  • Programacin II Diapositiva 21

    Convertir a un String el estado del objeto: String toString()

    Este mtodo devuelve una cadena (String) con informacin de

    estado del objeto. Esta informacin es especfica de cada objeto.

    En las subclases se debe sobreescribir correctamente.

    Ejemplo:

    Integer i = new Integer (88);

    System.out.println i.toString () );

    Resultado: 88

    Si se pasa una referencia el mtodo println llama al toString() del

    objeto referenciado:

    System.out.println

    Clase java.lang.Object

  • Programacin II Diapositiva 22

    Programacin II

    3.3. Clasesabstractas e interfaces

  • Programacin II Diapositiva 23

    Una clase o mtodo abstracto se declara utilizando la palabra

    reservada abstract:

    abstract public class ClaseAbstracta {

    abstract public void metodoAbstracto () ;

    public int otroMetodoImplementado () {

    /* cdigo */

    }

    }

    Un mtodo abstracto es un mtodo sin codificacin.

    Si una clase tiene un mtodo abstracto debe ser declarada

    obligatoriamente como abstracta. Una clase puede ser declarada

    como abstracta y no tener mtodos abstractos.

    Una clase abstracta no puede declarar mtodos abstractos

    privados ni mtodos estticos (no tiene sentido).

    Clases y mtodos abstractos

  • Programacin II Diapositiva 24

    Si una clase es abstracta no se pueden crear objetos de la

    misma, solo se utilizan como superclases en las jerarquas de

    herencia.

    Sus subclases -para que no sean abstractas a su vez- debern

    codificar todos los mtodos abstractos.

    public class EjemClase extends ClaseAbstracta {

    public void metodoAbstracto () {

    //implementacin

    }

    }

    Clases y mtodos abstractos

  • Programacin II Diapositiva 25

    Un interfaz es un conjunto de mtodos abstractos (sin

    implementacin) y valores constantes, que definen un contrato que

    deber ser cumplido por cualquier clase que la implemente.

    [acceso] interface UnaInterfaz [ extends listaDeInterfaces ]

    {

    int MAXIMO =10;

    void unMetodo ( Object obj );

    Object dosMetodo ( Object obj );

    int tresMetodo ();

    }

    Implcitamente las constantes son public, static y final; y los mtodos

    public y abstract.

    Interfaces

  • Programacin II Diapositiva 26

    // Definicin de la interfaz

    public interface Movil {

    String medidaVelocidad

    boolean arrancar();

    void girar( int grados);

    void setVelocidad ( double velocidad);

    }

    // Clase que implementa la interfaz

    public class Automovil implements Movil {

    public boolean arrancar(){ // implementacin }

    public void girar( int grados){ // implementacin }

    public void setVelocidad ( double velocidad){ // implementacin }

    }

    Interfaces: ejemplo de uso

  • Programacin II Diapositiva 27

    public class Moto implements Movil { /* codigo */ }

    Movil movil = new Movil (); // Incorrecto !

    Automovil auto = new Automovil ();

    Movil mAuto = auto; // Polimorfismo

    Movil mMoto = new Moto(); // Polimorfismo

    mMoto.arrancar (); // Asociacion dinmica

    mAuto.arrancar (); // Asociacion dinmica

    Polimorfismo y asociacin dinmica con interfaces

  • Programacin II Diapositiva 28

    Reglas:

    La interfaz proporciona un mecanismo para facilitar que su

    comportamiento (mtodos) pueda ser implementado por distintas clases

    de forma independiente a la herencia.

    Una interfaz puede extender ms de una interfaz, pero no puede

    extender clases. Una interfaz hereda todas las constantes y mtodos de

    sus superinterfaces, a no ser que tape las constantes o sobreescriba

    los mtodos.

    Una interfaz es un tipo de datos referencia, y como tal puede utilizarse,

    tanto en argumentos de mtodos como declaracin de variables. Adems

    se aplica el poliformismo con cualquier clase que la implemente de forma

    similar a como se hace con la relacin de herencia.

    Interfaces

  • Programacin II Diapositiva 29

    // Extensin de una interfaz

    public interface MovilAereo extends Movil {

    void setAltura ( double altura);

    }

    // Implementacin de la interfaz extendida

    public class Avion implements MovilAereo {

    public boolean arrancar () { ... }

    public void girar ( int grados ) { ... }

    public void setVelocidad ( double velocidad) {...}

    public void setAltura ( double altura) {...}

    }

    // Definicin de la interfaz con herencia mltiple

    public interface ReMovil extends Comparable, MovilAereo {

    }

    Interfaces: extensin de la interfaz

  • Programacin II Diapositiva 30

    Programacin II

    3.4. Excepciones

  • Programacin II Diapositiva 31

    Qu es una excepcin?

    Es una indicacin de que se ha detectado una situacin anmala

    durante la ejecucin de un programa.

    En Java se modela como una clase de objeto ms de un programa.

    Para qu se utilizan?

    El uso de excepciones en POO persigue gestionar errores

    fcilmente, detectarlos y, en la medida de lo posible, conseguir

    que un programa pueda continuar tras producirse errores.

    Ventajas

    Bien utilizadas aumentan en gran medida la robustez de las

    aplicaciones.

    Permite separar el tratamiento de errores del cdigo normal.

    Excepciones: Introduccin

  • Programacin II Diapositiva 32

    Actividades relacionadas con el uso de excepciones en Java:

    Capturar excepciones (bloques try-catch)

    Permite gestionar los errores producidos durante la ejecucin de un

    conjunto de sentencias.

    Lanzar excepciones

    Permite indicar que se ha detectado una anomala durante la ejecucin

    de un mtodo.

    Hay que crear una excepcin (un objeto) que describa la

    anomala en cuestin e

    Indicar que se ha detectado una anomala usando la palabra

    reservada throw.

    Cualquier mtodo que puede lanzar una excepcin debe indicarlo en

    su cabecera mediante la palabra clave throws.

    Definir nuevas clases de excepciones

    Excepciones: Conceptos

  • Programacin II Diapositiva 33

    Sintaxis del bloque de sentencias try/catch/finally

    t ry {

    Sentencias Java que pueden lanzar una excepcin

    }

    catch ( UnaExcepcion nombreVariable ) {

    Se captura la excepcin y se trata

    }

    catch ( OtraExcepcion nombreVariable ) {

    Otro manejador de excepciones. Si se captura arriba ya

    no se puede capturar aqu. Importante el orden de la

    captura, debe ser de ms especfico a ms genrico.

    }

    finally {

    Siempre se ejecuta este bloque de sentencias, se haya

    producido excepcin o no.

    }

    Excepciones: Capturar

  • Programacin II Diapositiva 34

    CAPTURA DE EXCEPCIONES (Basado en la figura 11.2 de [1])

    import java.util .*;

    public class Ejemplo {

    // demonstrates throwing an exception when a divide - by - zero occurs

    public static int quotient ( int numerator , int denominator ){

    return numerator / denominator; // JVM would detect error division

    // by zero and would and

    // throw exception.

    } // end method quotient

    public static void main( String[] args ) {

    Scanner scanner = new Scanner( System. in ); // scanner for input

    System. out .print ( " Please enter an integer numerator : " );

    int numerator = scanner.nextInt (); scanner.nextLine ();

    System. out .print ( " Please enter an integer denominator : " );

    int denominator = scanner.nextInt (); scanner.nextLine ();

    int result = quotient ( numerator , denominator );

    System. out .printf ( " \ nResult : %d." , result );

    }

    }

    Captura

  • Programacin II Diapositiva 35

    Pleaseenter an integer numerator: 100Pleaseenter an integer denominator: 0 Exception in thread "main" java.lang.ArithmeticException: / by zero

    at Ejemplo.quotient(Ejemplo.java:4)at Ejemplo.main(Ejemplo.java:14)

    Captura

    Please enter an integer numerator: 100 Please enter an integer denominator: hello Exception in thread "main" java.util.InputMismatchException

    at java.util.Scanner.throwFor(Unknown Source)at java.util.Scanner.next(Unknown Source)at java.util.Scanner.nextInt (Unknown Source)at java.util.Scanner.nextInt (Unknown Source)at Ejemplo.main(Ejemplo.java:11)

  • Programacin II Diapositiva 36

    CAPTURA DE EXCEPCIONES (Basado en la figura 11.2 de [1])

    import java.util.InputMismatchException ;

    import java.util.Scanner ;

    public class Ejemplo {

    // demonstrates throwing an exception when a divide - by - zero occurs

    public static int quotient ( int numerator , int denominator ){

    return numerator / denominator; // JVM would detect error division

    // by zero and would and

    // throw exception.

    } // end method quotient

    public static void main( String[] args ) {

    Scanner scanner = new Scanner( System. in ); // scanner for input

    boolean error= false ; // determines if more input is needed

    do{

    try { // read two numbers and calculate quotient

    System. out .print ( " Please enter an integer numerator : " );

    int numerator = scanner.nextInt (); scanner.nextLine ();

    System. out .print ( " Please enter an integer denominator : " );

    int denominator = scanner.nextInt (); scanner.nextLine ();

    int result = quotient ( numerator , denominator );

    System. out .printf ( " \ nResult : %d." , result );

    error = false ; // input successful; end looping

    } // end try

    Excepciones: Ejemplo de captura

    Lee de teclado

    dos nmeros

    enteros y saca

    por pantalla la

    divisin entera.

  • Programacin II Diapositiva 37

    CAPTURA DE EXCEPCIONES (Basado en la figura 11.2 de [1])

    catch ( InputMismatchException inputMismatchException ){

    scanner.nextLine (); // discard input so user can try again

    System. out .println ( "You must enter integers. Try again. \ n" );

    error = true ;

    } // end catch

    catch ( ArithmeticException arithmeticException ){

    System. out .println ( \ n" );

    error = true ;

    } // end catch

    } while ( error ); // end do...while

    } // end main

    } // end class Ejemplo

    Excepciones: Ejemplo de captura

  • Programacin II Diapositiva 38

    Las excepciones pueden ser lanzadas por la JVM (Java Virtual

    Machine) al detectar un error:

    En el ejemplo anterior, la JVM lanza la excepcin

    ArithmeticException cuando detecta una divisin por 0.

    O por el propio programador al comprobar que no se cumple una

    condicin utilizando la clausula throw y creando un objeto

    correspondiente a la excepcin:

    Excepciones: Lanzar

    public static int quotient ( int numerator , int denominator ){

    if ( denominator == 0 )

    throw new ArithmeticException ();

    return numerator / denominator;

    }

  • Programacin II Diapositiva 39

    CAPTURA DE EXCEPCIONES (Basado en la figura 11.2 de [1])

    import java.util.InputMismatchException ;

    import java.util.Scanner ;

    public class EjemLanzar {

    public static int quotient ( int numerator , int denominator )

    {

    if ( denominator == 0 ) // The program detects the problem, creates

    // the exception and throws it.

    throw new IllegalArgumentException ( "Divide by Zero" );

    return numerator / denominator;

    } // end method quotient

    public static void main( String[] args ) {

    Scanner scanner = new Scanner( System. in ); // scanner for input

    boolean error= false ; // determines if more input is needed

    do{

    try { // read two numbers and calculate quotient

    System. out .print ( " Please enter an integer numerator : " );

    int numerator = scanner.nextInt (); scanner.nextLine ();

    System. out .print ( " Please enter an integer denominator : " );

    int denominator = scanner.nextInt (); scanner.nextLine ();

    int result = quotient ( numerator , denominator );

    System. out .printf ( " \ nResult : %d." , result );

    error = false ; // input successful; end looping

    } // end try

    Excepciones: Ejemplo de lanzar

    Lee de teclado

    dos nmeros

    enteros y saca

    por pantalla la

    divisin entera.

  • Programacin II Diapositiva 40

    CAPTURA DE EXCEPCIONES (Basado en la figura 11.2 de [1])

    catch ( InputMismatchException inputMismatchException ){

    scanner.nextLine (); // discard input so user can try again

    System. out .println ( "You must enter integers.Try again. \ n" );

    error = true ;

    } // end catch

    catch ( IllegalArgumentException exception ){

    System. out .println ( "No 0 as denominator. Try again. \ n" );

    error = true ;

    } // end catch

    } while ( error ); // end do...while

    } // end main

    } // end class EjemLanzar

    Excepciones: Ejemplo de lanzar

  • Programacin II Diapositiva 41

    Excepciones: Jerarqua excepciones predefinidas

    Las excepciones y su jerarqua de clases es la que se muestra en

    la figura siguiente:

  • Programacin II Diapositiva 42

    La clase Throwable tiene como subclases:

    La clase Error : relacionada con errores internos del sistema o de la JVM.

    No se deberan capturar.

    La clase Exception se subdivide en:

    Clase RuntimeException y subclases (excepciones no

    comprobables):

    Excepciones producidas en tiempo de ejecucin, relacionadas con errores

    de programacin:

    NullPointerException.

    ArrayIndexOutOfBoundsException.

    .

    Java no obliga a capturarlas o a declararlas en los mtodos que pueden

    lanzarlas.

    Excepciones: Jerarqua excepciones predefinidas

  • Programacin II Diapositiva 43

    Las dems clases derivadas de Exception (excepciones

    comprobables) :

    Son excepciones definidas por el programador

    Java s obliga a capturarlas y a declararlas en los mtodos que pueden

    lanzarlas.

    Ejemplo definicin:

    public class MiException extends Exception {

    public MiException (){}

    public MiException (String mensajeError ){

    super(s);

    }

    }

    Excepciones: Jerarqua excepciones predefinidas

  • Programacin II Diapositiva 44

    Algunos mtodos de utilidad heredados de la superclase Throwable

    por todas las excepciones:

    void printStackTrace() .

    Imprime en la salida estndar todos los mtodos por los que ha

    ido pasando, desde donde se gener, la excepcin

    String getMessage()

    Devuelve la cadena informativa con la que se cre la excepcin.

    try {

    // cdigo que puede lanzar excepciones

    } catch( ExceptionMenorEdad e ) { //captura y tratamiento

    System.out.println e.getMessage () );

    e. printStackTrace ():

    }

    Excepciones: Jerarqua excepciones predefinidas

  • Programacin II Diapositiva 45

    Ejemplo excepciones comprobables:

    Ejemplo excepciones no comprobables

    EXCEPCIONES COMPROBABLES

    public class ExcepComprobables {

    private static int quotient ( int numerator ,

    int denominator ) throws MiException

    {

    if ( denominator == 0 )

    throw new MiException ( by 0 " );

    return numerator / denominator ;

    }

    public static void main(String[] args ) throws MiException

    {

    System. out .printf ( "Result: %d \ n" , quotient(3, 0));

    }

    }

    Java obliga a poner bloque try-catch throws

  • Programacin II Diapositiva 46

    Las excepciones pueden ser lanzadas por el propio programador o

    por clases que ste utilice.

    Cuando al ejecutar un mtodo A de una clase se produce una

    excepcin y la sentencia que genera la excepcin no est capturada

    en un bloque try-catch, la excepcin se propaga hacia el mtodo

    llamante B que fue el que invoc el mtodo A. Y a su vez, si la

    sentencia dentro del mtodo B que invoc el mtodo A no est dentro

    de un bloque try-catch, se propaga hacia el mtodo que invoc al

    mtodo B. Este proceso se repite hasta llegar al main, donde

    finalmente si no se captura provocar la finalizacin de la aplicacin.

    Excepciones: Lanzar

  • Programacin II Diapositiva 47

    Ejemplo 1:

    public class Ejem1 {

    private static void metodo1() throws Exception{

    metodo2();

    }

    private static void metodo2() throws Exception{

    throw new Exception ( "Excepcin en metodo2" );

    }

    public static void main(String[] args ) throws Exception{

    metodo1();

    }

    }

    Salida por pantalla

    Exception in thread "main" java.lang.Exception : Excepcin en

    metodo2

    at Ejem1.metodo2( Ejem1.java:6 )

    at Ejem1.metodo1( Ejem1.java:3 )

    at Ejem1.main( Ejem1.java:9 )

    Excepciones: Propagacin de excepciones

    Ningn mtodo captura la excepcin.

  • Programacin II Diapositiva 48

    Ejemplo 1:

    public class Ejem2 {

    private static void metodo1() throws Exception{

    metodo2();

    }

    private static void metodo2() throws Exception{

    throw new Exception ( "Excepcin en metodo2" );

    }

    public static void main(String[] args ){

    try {

    metodo1();

    } catch ( Exception e){

    System. out .println ( "Error: " +e.getMessage ());

    }

    }

    }

    Salida por pantalla

    Error: Excepcin en metodo2

    Excepciones: Propagacin de excepciones

    main captura la excepcin.

  • Programacin II Diapositiva 49

    Ejemplo 1:

    public class Ejem3 {

    private static void metodo1(){

    try {

    metodo2();

    } catch ( Exception e){

    System. out .println ( "En metodo1: " +e.getMessage ());

    }

    }

    private static void metodo2() throws Exception{

    throw new Exception ( "Excepcin en metodo2" );

    }

    public static void main(String[] args ){

    metodo1();

    }

    }

    Salida por pantalla

    En metodo1: Excepcin en metodo2

    Excepciones: Propagacin de excepciones

    metodo1 captura la excepcin.

  • Programacin II Diapositiva 50

    Objetivo principal:

    Liberar los recursos que tenga un mtodo, una clase, un programa, y que tras producirse una excepcin no se necesitan: cerrar un fichero, cerrar una conexin con otro ordenador a travs de una red de datos, cerrar una conexin con una base de datos, etc.

    Sintaxis:

    Siempre va al final de la ltima clusula catch o justo despus de la clusula try si el bloque try-catch correspondiente no tiene clusula catch.

    Entre llaves contiene la secuencia de sentencias asociada a la clusula finally.

    Propiedades:

    Las sentencias de la clusula finally se ejecutan siempre salvo que se haya invocado el mtodo System.exit(int cause) en las clusulas try o catch.

    Se ejecuta incluso a continuacin de que se llegue a una sentencia return en las clusulas try o catch.

    Si en las clusulas try o catch se generar una excepcin no capturada por dicho bloque try-catch, primero se ejecutan las sentencias de la clusula finallyy luego se procesa la excepcin (propagarla o terminar la aplicacin).

    Excepciones: Uso de finally

    Ver figura 11.4 de [1]

  • Programacin II Diapositiva 51

    Para cerrar los recursos abiertos.

    pStr hay que cerrarlo, se produzca o no una excepcin.

    public void writeList () {

    PrintStream pStr = null ;

    try {

    pStr = new PrintStream

    }

    catch ( IOException e) {

    System.err.println (" Caught IOException : " + e.getMessage ());

    }

    finally { //cerramos el flujo

    if ( pStr != null ) { pStr.close (); }

    }

    }

    Excepciones: Un ejemplo de uso del finally

  • Programacin II Diapositiva 52

    Programacin II

    3.5. Paquetes

  • Programacin II Diapositiva 53

    Qu son los paquetes?

    Los paquetes son grupos relacionados de clases e interfaces que

    proporcionan un mecanismo para evitar los conflictos de nombres.

    Los nombres de clases no tienen conflictos con los nombres de las

    clases de otros paquetes. (tcnicamente un paquete crea un nuevo

    espacio de nombres).

    Las clases e interfaces que ofrece Java estn estructuradas en

    paquetes.

    Los nombres de paquetes pueden contener varios componentes

    (separados por puntos).

    Paquetes: Definiciones I

  • Programacin II Diapositiva 54

    De hecho, los nombres de los paquetes de Java tienen varios

    componentes: java.util, java.lang, etc...

    El usuario puede crear sus propios paquetes e incluir en ellos clases e

    interfaces utilizando la sentencia package.

    Si no se especifica la sentencia package en una clase o interfaz se

    convierten en miembros del paquete annimo que siempre es

    importado.

    Paquetes: Definiciones II

    package ejemplo;

    public class Miclase{

    }

    package otro.ejemplo;

    public class Miclase{

    } //paquete anonimo

    public class Miclase{

    }

  • Programacin II Diapositiva 55

    Ejemplo HolaMundo.java dentro del paquete prueba

    package prueba;

    public class HolaMundo {

    public static void main (String [ ] args) {

    System.out.println ("Hola mundo");

    }

    }

    Esto obliga a escribir el fichero HolaMundo.java dentro de una carpeta que

    se llame prueba.

    c:\prg2\prueba\HolaMundo.java

    La compilacin

    c:\> cd c:\prg2\prueba

    c:\prg2\prueba> javac prueba\HolaMundo.java

    La ejecucin

    c:\prg2\prueba :\> java prueba.HolaMundoHola Mundo

    Ejemplo: package prueba

  • Programacin II Diapositiva 56

    En el ejemplo siguiente tenemos dos clases que pertenece a paquetes

    diferentes. La interfaz Dibujo pertenece al paquete graficos.comun

    y la clase Circulo pertenece al paquete graficos.

    Paquetes anidados e import: Ejemplo

    /*fichero Dibujo.java*/

    package graficos.comun;

    public interface Dibujo{

    . . .

    }

    /*fichero Circulo.java*/

    package graficos;

    import graficos.comun.Dibujo;

    public class Circulo implements Dibujo{

    . . .

    }

  • Programacin II Diapositiva 57

    Los ficheros Dibujo.java y Circulo.java que representan a las clases en las

    que hemos definido los paquetes: package , deben estar situados en un

    directorio llamado:

    ..\graficos\comun\Dibujo.java

    ..\graficos\Circulo.java

    Los ficheros .class generados por el compilador deben situarse en un

    directorio llamado

    ..\graficos\comun\Dibujo.class

    ..\graficos\Circulo.class

    Paquetes: ubicacin del fuente *.java

  • Programacin II Diapositiva 58

    Cuando en una clase o interfaz hacemos referencia a otra clase que no se

    encuentra dentro del mismo paquete debemos importarla, si no, el

    compilador nos dar un error.

    se utiliza la sentencia import (el nombre de la clase paquete completo)

    Para importar una clase especfica:

    import graficos.utilidad.Dibujo;

    Para importar todas las clases de un determinado paquete:

    import graficos.utilidad.*;

    Si una clase est repetida en dos paquetes diferentes para romper la

    ambigedad, se la referencia con su nombre completo:

    graficos.Circulo circulo;

    Paquetes: utilizacin

  • Programacin II Diapositiva 59

    Los paquetes tambin establecen un nivel de visibilidad para las clases y los

    miembros (variables y mtodos) de las clases cuando no se dice

    explcitamente el acceso.

    Por ejemplo, la variable x y el mtodo mx de la siguiente clase:

    package ejem;

    class C {

    String x= hola";

    void mx (...) { ... }

    }

    Paquetes: Control de acceso

    Sern accesibles para todas las

    clases del paquete ejem; pero

    inaccesibles por clases de otros

    paquetes.

  • Programacin II Diapositiva 60

    Las clases e interfaces slo pueden ser public o package (package es la

    opcin por defecto cuando no se pone ningn modificador).

    Las variables miembro y los mtodos pueden ir precedidas en su declaracin

    por uno de los modificadores de acceso: public, private, protected y

    package (que es el valor por defecto y puede omitirse).

    Paquetes: Control de acceso

  • Programacin II Diapositiva 61

    Bibliografa

    Referencias

    [1] Paul Deitel- Deitel& Associates, Inc.; Harvey Deitel- Deitel&

    Associates programar? Novena edicin.,

    Prentice Hall, 2011.

    [2] K. Sierra y B. Bates, Head FirstJava, 2nd Edition, O'Reilly

    Media, Inc., 2005.

  • Programacin II Diapositiva 62

    Contenidos

    Contenidos:

    Herencia

    Secciones 9.1 a 9.6 de [1].

    Captulo 7 de [2].

    Poliformismo , asociacin dinmica y clase Object

    Polimorfismo y asociacin dinmica:

    Secciones 10.2, 10.3, 10.5 de [1]

    Captulo 7 de [2].

    Clase Object

    Seccin 9.7 de [1].

    Clasesabstractas e interfaces

    Seccin 10.4 y 10.7 de [1]

    Captulo 8 de [2].

    Excepciones

    Secciones 11.1 a 11.10 de [1].

    Captulo 11 de [2].

    Paquetes

    Seccin 8.14 de [1].

    Seccin Put your classesin packages! del captulo 17 de [2].

    Bibliografa