Herencia Paquetes Excepciones - PowerPoint PPT Presentation

1 / 64
About This Presentation
Title:

Herencia Paquetes Excepciones

Description:

public Object extraer (); import java.util. ... String s = p.extraer(); // Al usar gen ricos, se hace // un casting autom ticamente ... – PowerPoint PPT presentation

Number of Views:94
Avg rating:3.0/5.0
Slides: 65
Provided by: arantx
Category:

less

Transcript and Presenter's Notes

Title: Herencia Paquetes Excepciones


1
HerenciaPaquetesExcepciones
2
Herencia
  • class A extends B especifica que la clase A
    hereda datos y métodos de clase B.
  • La clase A tiene acceso a miembros de B con
    modificador public, protected, o vacío
    (cuando A y B están en el mismo paquete)
  • Variable super (privada) tiene acceso al objeto
    de la superclase
  • En situaciones excepcionales puede interesar
    definir una variable en la subclase con el mismo
    nombre que la superclase (se tendrían huecos
    diferentes de memoria)

3
Ejemplo
  • public class Ejemplo
  • public static void main(String args)
  • A anew B()
  • B b new B()
  • System.out.print("Valor de v en a "
    a.v) // a.v66
  • System.out.print("Valor de v en b "
    b.v) // b.v8.0
  • public class A
  • private int x3 public int y4
  • private int u5 public int v6
  • public class B extends A
  • private z 9 private double u public
    double v
  • public B ()
  • // this.x33 (ilegal)
  • this.y44 // tambien valdría super.y44
  • // super.u55 (ilegal)
  • this.u7
  • super.v66

4
Constructores
  • Si A extends B, las llamadas explícitas a
    constructores de B se hacen con
    super(argumentos)
  • En tal caso, la llamada super(argumentos) debe
    ser la primera instrucción en un constructor de A
  • Uso de this(...) y super(...) en un
    constructor
  • Si no contiene ni super(...) ni this(...), se
    ejecuta super()
  • Error super(...) this(....) ...
  • Por tanto, la instrucción super() sólo se
    ejecuta una vez.
  • Si una variable de una clase es, por ejemplo,
    public int n 7
  • Se asigna el valor 7 después de ejecutarse
    super() en algún constructor. Después se
    entraría en el constructor de esta clase. Las
    variables que primero se crean son las de la
    superclase.
  • Mecanismo análogo para variables static

5
Ejemplo
  • public class A
  • private int x
  • public A ()
  • this.x7
  • public A (int x)
  • this.xx
  • public class B extends A
  • private int y
  • public B ()
  • super() // omitiéndolo, también se
    ejecuta
  • this.y5
  • public B (int x, int y)
  • super(x)
  • this.yy

6
Uso de protected
  • Referido en clases.ppt
  • Ejemplo en la clonación de un objeto (shallow
    copy not deep copy)
  • Clase java.lang.Object
  • protected Object clone()
  • throws CloneNotSupportedException
  • class R extends K
  • public class K extends Object
  • public void f () throws Exception
  • this.clone() super.clone()
  • Object o new Object()
  • // o.clone() error de compilación
  • R r new R()
  • r.clone() // correcto
  • public static void main(String args)
  • String s"hola"
  • //s.clone() error de compilación

7
Overriding methods
  • Un método se puede especializar, redefinir o
    sustituir (overriding) en una subclase
  • El tipo de retorno, nombre del método, tipo y
    número de argumentos debe ser el mismo
  • Las excepciones lanzadas (no descendientes de
    RuntimeException) deben ser, como mucho, las
    declaradas por el método a redefinir (o clases
    descendientes) que no sean descendientes de
    RuntimeException.
  • Los modificadores deben ser al menos tan
    generales como los del método en la superclase
    (por ejemplo, protected-gtpublic, pero no
    protected-gtprivate)
  • super.ltmetodogt accede al método de la
    superclase
  • Si el método en la superclase es final no se
    puede hacer overriding. Seguridad o diseño
    perfecto.

8
Ejemplo
  • public class Ejemplo
  • public static void main(String args)
  • B b new B()
  • b.f(3)
  • En clase A 3
  • En clase B 3
  • public class A
  • public void f (int x)
  • System.out.println("En clase A " x)
  • public class B extends A
  • public void f (int x)
  • System.out.println("En clase B " x)
  • super.f(x)

9
Clases de expresiones asignaciones
  • Diferencia entre clase en tiempo de compilación
    (tipo declarado), y clase en tiempo de ejecución
    (procedendia a través de new ...) de una
    expresión.
  • Como ocurre con los tipos primitivos
  • Una asignación ltvariablegtltexpresiongt (donde C
    denota la clase en tiempo de compilación de
    ltexpresiongt) es válida (en tiempo de compilación)
    cuando la clase de ltvariablegt es C o una clase
    ascendiente de C

10
Operador instanceof castings
  • Un casting de la forma (ltclasegt)ltexpresiongt
    es válido en tiempo de compilación cuando la
    clase de ltexpresiongt es ltclasegt, o bien una otra
    ascendiente o descendiente de ltclasegt
  • Operador booleano instanceof
  • ltexpresiongt instanceof ltclasegt
  • Válido en tiempo de compilación si también lo es
    (ltclasegt)ltexpresiongt
  • Devuelve true si la clase en tiempo de
    ejecución de ltexpresiongt es ltclasegt o una
    descendiente de ltclasegt
  • Para un casting válido en tiempo de
    compilación, en tiempo de ejecución se produce
    una java.lang.ClassCastException cuando no se
    verifica que ltexpresiongt
    instanceof ltclasegt

11
Ejemplo
  • public class Ejemplo
  • public static void main(String args)
  • Punto p1new Punto(1,2), p2new Punto(1,2)
  • System.out.println("p1p2 " (p1p2))
  • System.out.println("p1.equals(p2) "
    p1.equals(p2))
  • p1p2 false
  • p1.equals(p2) true
  • public class Punto extends Object
  • private int x, y
  • public Punto (int x, int y)
  • this.xx this.yy
  • // Lo mismo que para Strings.
  • public boolean equals (Object o)
  • if (o instanceof Punto)
  • Punto p (Punto)o
  • return this.xp.x this.yp.y

12
Ligadura dinámica (I)
  • Consiste en la asignación en tiempo de ejecución
    del código a ejecutar para un determinado método
    (en Java todos los métodos son virtuales, según
    el formalismo de C)
  • La elección del código a ejecutar para la
    instrucción (un solo argumento)
  • ltexpresiongt.ltmetodogt(ltargumentogt), en donde C1
    y C2 son las clases estática y dinámica,
    respectivamente, de ltexpresiongt consiste en
  • 1) Tiempo de compilación. Se determina la
    cabecera del método a aplicar. Si existe
    overloading de ltmetodogt en C1
  • Se determinan las clases (en tiempo de
    compilación) de ltargumentogt y se elige el método
    más específico definido para ltmetodogt en la
    clase C1
  • 2) Tiempo de ejecución. Una vez seleccionada la
    cabecera a aplicar en paso 1) , si se ha hecho
    overriding de ltmetodogt en C2 se aplica ligadura
    dinámica (si no hay ligadura dinámica, se aplica
    el método de la clase C1)

13
Ligadura dinámica (II)
  • Ejemplo
  • algoritmo-desambiguacion-polimorfismo
  • El algoritmo de selección es más complicado para
    varios argumentos
  • Se considera aquel en que el número de
    promociones sea mínimo (a igualdad, error de
    compilación por ambigüedad).
  • Si para una promoción existen varios caminos
    posibles (debido a la herencia múltiple de
    Java), se considera el camino más largo.

14
Ejemplo
  • public class Ejemplo
  • public static void main(String args)
  • A array new A(), new B(), new C()
  • for (int i0 ilt3 i)
  • arrayi.f(3)
  • En clase A 3
  • En clase B 3
  • En clase C 3
  • class A
  • public void f (int x)
  • System.out.println("En clase A " x)
  • class B extends A
  • public void f (int x)
  • System.out.println("En clase B " x)

15
Jerarquía de clases
  • Si no se especifica herencia en una clase, se
    supone que hereda de clase java.lang.Object
  • class A ... equivale a
    class A extends Object ...
  • public class java.lang.Object
  • public boolean equals(Object obj)
  • public String toString()
  • public Classlt? extends Objectgt getClass()
  • obtiene clase en tiempo de ejecución
  • protected void finalize()
  • Llamada por el garbage collector antes de
    destruir el objeto porque ha dejado de ser
    referenciado
  • Los arrays son también instancias de una clase
    subclase de Object

16
Ejemplo Robots
  • public class Ejemplo
  • public static void main(String args)
  • Robot r1,r2
  • r1new Robot(1, 1) r1.avanzar(2)
  • r2new RobotConFrontera(2, 1, 0, 0)
  • r2.avanzar(-2)
  • System.out.println("Robot1 "
    r1.toString())
  • System.out.println("Robot2 "
    r2.toString())
  • Robot1 Robot3, 3
  • Robot2 Robot0, 1bordes 0, 0

17
Ejemplo Robots (cont)
  • public class Robot
  • private int x, y
  • public Robot (int x, int y)
  • this.xx this.yy
  • public void avanzar (int a)
  • this.xa this.ya
  • public int coordX ()
  • return this.x
  • public int coordY ()
  • return this.y
  • public void asignarX (int x)
  • this.xx
  • public void asignarY (int y)
  • this.yy
  • public String toString ()
  • return "Robot" this.x ", " this.y
    ""

18
Ejemplo Robots (cont)
  • public class RobotConFrontera extends Robot
  • private int limX, limY
  • public RobotConFrontera (int x, int y, int
    limX, int limY)
  • super(x,y)
  • this.limXlimX
  • this.limYlimY
  • public void avanzar (int a)
  • int huecoX(acoordX())-this.limX
  • if (huecoXgt0)
  • asignarX(acoordX())
  • else asignarX(this.limX-huecoX)
  • int huecoY(acoordY())-this.limY
  • if (huecoYgt0)
  • asignarX(acoordY())
  • else asignarY(this.limY-huecoY)
  • public String toString ()
  • return super.toString() "bordes "
    this.limX

19
Clases y métodos abstractos
  • Una clase es abstracta cuando no se pueden crear
    instancias de ella. Es decir, si la clase A es
    abstracta, es ilegal hacer new A(...).
  • Sin embargo, sí se pueden definir constructores
    que pueden ser llamados por subclases con
    super(...)
  • Un método abstracto se define sin implementación
    en una clase abstracta. Las subclases deben
    implementarlo

20
Ejemplo
  • public class Ejemplo
  • public static void main(String args)
  • Figura figuras new Figura2
  • Punto p1new Punto(0,0), p2new Punto(1,0),
  • p3new Punto(0,1)
  • figuras0 new Triangulo("rojo", p1, p2,
    p3)
  • figuras1 new Circulo("verde", p1, 1)
  • for(int i0 iltfiguras.length i)
  • System.out.println("Area "
    figurasi.area())
  • public abstract class Figura
  • private String color
  • public Figura (String color)
  • this.colorcolor
  • public abstract double area ()

21
Ejemplo (cont)
  • public class Punto
  • private double x, y
  • public Punto (int x, int y)
  • this.xx this.yy
  • public double valorX ()
  • return this.x
  • public double valorY ()
  • return this.y
  • public class Triangulo extends Figura
  • private Punto p1, p2, p3
  • public Triangulo (String color, Punto p1,
  • Punto p2, Punto
    p3)
  • super(color) this.p1p1 this.p2p2
    this.p3p3
  • public double area ()
  • double athis.p2.valorX()-this.p1.valorX()
    ,
  • bthis.p2.valorY()-this.p1.valorY()
    ,
  • cthis.p3.valorX()-this.p1.valorX()
    ,
  • dthis.p3.valorY()-this.p1.valorY()

22
Ejemplo (cont)
  • public class Circulo extends Figura
  • private Punto centro
  • private double radio
  • public Circulo (String color, Punto centro,
    double radio)
  • super(color)
  • this.centrocentro this.radioradio
  • public double area ()
  • return Math.PIthis.radiothis.radio

23
Interfaces
  • Una interface en Java es una colección de
    definiciones de métodos (sin implementación) y de
    valores constantes
  • Una interface es análogo a una clase abstracta
    con todos sus métodos abstractos y variables
    finales y estáticas con valor inicial.
  • Una clase A puede heredar de una sola clase
    (extendsltltgtgtherencia simple) y puede heredar de
    varias interfaces (implements ltltgtgtherencia
    múltiple).
  • Ambigüedades no permitidas en herencia de
    variables (en general Java no resuelve por sí
    mismo las ambigüedades en ningún caso)
  • Todas las interfaces descienden de Object
  • No se permiten ciclos en el grafo de clases e
    interfaces

24
Ejemplo (I)
  • public class Ejemplo
  • public static void main(String args)
  • Pila p new Pila()
  • p.introducir("abc") p.introducir("def")
  • System.out.println("Pila " p)
  • String s (String)p.extraer()
  • Resultado Pila abc
  • public interface Coleccion
  • public int MAXIMO_NUMERO500
  • public void introducir (Object o)
  • public Object extraer ()
  • import java.util.
  • public class Pila extends Object implements
    Coleccion
  • private ArrayList elementos
  • public Pila ()

25
Ejemplo (II)
  • public void introducir (Object o)
  • if (this.elementos.size()ltMAXIMO_NUMER
    O)
  • this.elementos.add(o)
  • public Object extraer ()
  • Object ultimonull
  • // Si hubiéramos hecho Object
    ultimo, se habría
  • // obtenido el error de compilación
  • //Variable ultimo may not have been
    initialized
  • if (!vacia())
  • int nthis.elementos.size()
  • ultimothis.elementos.remove(n-1)
  • return ultimo
  • public boolean vacia ()
  • return this.elementos.size()0
  • public String toString ()

26
Ejemplo con genéricos (I)
  • public class Ejemplo
  • public static void main(String args)
  • PilaltStringgt p new PilaltStringgt()
  • p.introducir("abc") p.introducir("def")
  • System.out.println("Pila " p)
  • String s p.extraer()
  • // Al usar genéricos, se hace
  • // un casting automáticamente
  • public interface Colección ltTgt
  • public int MAXIMO_NUMERO500
  • public void introducir (T o)
  • public T extraer ()
  • import java.util.
  • public class Pila ltTgt extends Object

27
Ejemplo con genéricos (II)
  • public void introducir (T o)
  • if (this.elementos.size()ltMAXIMO_NUMER
    O)
  • this.elementos.add(o)
  • public T extraer ()
  • T ultimonull
  • // Si hubiéramos hecho T ultimo, se
    habría
  • // obtenido el error de compilación
  • //Variable ultimo may not have been
    initialized
  • if (!vacia())
  • int nthis.elementos.size()
  • ultimothis.elementos.remove(n-1)
  • return ultimo
  • public boolean vacia ()
  • return this.elementos.size()0
  • public String toString ()

28
Definición de interfaces
  • public ... interface ltnombre-de-interfacegt
    extends ltinterface1gt,ltinterface2gt ...
  • Una interface puede heredar de otras interfaces
  • Las variables de la interface
  • public ... lttipogt ltnombre-variablegt
    ltvalorgt
  • Son variables estáticas y finales (constantes)
  • Los métodos se definen sin código (igual que los
    métodos abstractos) y cualquier clase que
    implemente la interfaz los debe definir. El único
    modificador admitido es el de privacidad. El
    modificador abstract es opcional
  • Un paquete es un conjunto de interfaces, clases,
    excepciones (y también de enumeraciones, errores
    y anotaciones, como en java.lang)

29
Una interface predefinida
  • Ejemplo
  • Interface java.util.IteratorltTgt
  • public boolean hasNext()
  • public T next()
  • public void remove()
  • En clase java.util.ArrayListltTgt
  • public IteratorltTgt iterator()

30
Ejemplo
  • import java.util.
  • public class Ejemplo
  • public static void main(String args)
  • Pais paisesnew Pais("Italia"),
  • new Pais("Francia"),new Pais("España")
  • Entero numerosnew Entero(3),
  • new Entero(4), new Entero(1)
  • Algoritmos.ordenar(paises)
  • Algoritmos.ordenar(numeros)
  • for (int i0 iltpaises.length i)
  • System.out.println(paisesi)
  • for (int i0 iltnumeros.length i)
  • System.out.println(numerosi)
  • España
  • Francia
  • Italia
  • 1

31
Ejemplo (cont)
  • public interface Ordenable
  • boolean menorQue(Ordenable a)
  • public class Algoritmos
  • public static void ordenar(Ordenable a )
  • Ordenable temp
  • int este
  • for (int i0 ilta.length-1 i)
  • este i
  • for (int ji1 jlta.length j)
  • if (aj.menorQue(aeste)) este
    j
  • tempaeste aesteai aitemp
  • public class Entero implements Ordenable
  • private int valor
  • public Entero (int n)
  • this.valor n

32
Ejemplo (cont)
  • public boolean menorQue(Ordenable entero)
  • Entero i (Entero) entero
  • return valorlti.valor
  • public String toString ()
  • return String.valueOf(this.valor)
  • public class Pais implements Ordenable
  • private String nombre
  • public Pais (String n)
  • this.nombre n
  • public boolean menorQue(Ordenable pais)
  • Pais b (Pais) pais
  • return nombre.compareTo(b.nombre)lt0
  • public String toString ()
  • return this.nombre

33
Uso de la clase Collections
  • ArrayListltIntegergt arr new
    ArrayListltIntegergt()
  • arr.add(new Integer(3))
  • arr.add(new Integer(5))
  • arr.add(new Integer(4))
  • System.out.println("Lista " arr)
  • Object obb Collections.max(arr)
  • System.out.println("MAXIMO" obb)
  • Collections.sort(arr)
  • System.out.println("Lista " arr)
  • RESULTADO
  • Lista 3, 5, 4
  • MAXIMO5
  • Lista 3, 4, 5
  • DOCUMENTACIÓN
  • Clase "java.util.Collections"
  • public static ltT extends Comparablelt? super Tgtgt

34
Uso de genéricos (I)
  • Al usar genéricos, Java realiza los siguientes
    pasos al compilar
  • 1) Precompilar (aquí aparecen los errores de
    compilación existentes)
  • 4) Borrado de tipos (type erasure)
  • Sustituir los tipos parámetros en clases y
    métodos por la cota superior del parámetro
    (Object si no tiene). Eliminar todos los ltgt
    que aparezcan (erasure) en clases, métodos y
    tipos con comodines (?).
  • 3) Insertar castings en los lugares en donde se
    hacen llamadas a los genéricos
  • 4) Compilar el código resultante de los pasos
    anteriores (con seguridad ya no aparecerán
    errores de compilación ni contendrá genéricos ni
    comodines)
  • El borrado de tipos se utiliza para hacer el
    código 1.5 compatible con las versiones
    anteriores de Java

35
Uso de genéricos (II)
  • En el paso 1)
  • Dentro de un genérico, una expresión compila
    correctamente si compila para cualquier valor
    posible de los tipos parámetros
  • Una asignación a un tipo con comodín compila si
    el comodín es asignable. Por ejemplo
  • ArrayListlt? extends Objectgt ArrayListltStringgt
    es correcto
  • Pero no al contrario
  • Conceptualmente se puede considerar que el tipo
    ArrayListlt? extends Objectgt es ascendiente de
    ArrayListltStringgt
  • En otras expresiones involucrando a tipos con
    comodín, la expresión compila correctamente si
    compila para cualquier valor posible de los
    comodines.

36
Uso de genéricos (III)
  • Debido al algoritmo anterior, dentro de un
    genérico
  • No se permite el uso de instanceof (porque
    siempre se estaría haciendo instanceof
    cota-superior )
  • Tampoco se permite hacer new T porque siempre
    se haría new cota-superior(). Tampoco es
    posible new T... por la misma razón
  • Pero sí se permite el uso de casting al tipo
    parámetro
  • En la definición de un tipo parámetro sólo se
    puede utilizar extends, pero no super (sólo
    posible una cota superior pero no inferior)

37
Ejemplos
  • ArrayListltStringgt l1new ArrayListltStringgt()
  • ArrayListlt? extends Objectgt l5
  • // vale también (equivalentemente)
  • // ArrayListlt?gt l5
  • l5l1 // compila bien porque existe
    un valor válido // de ? para que sea
    posible
  • // l1l5 error de compilacion
  • // l5.add(new Object())
  • // debe ser válido para cualquier valor de ? y
    por // tanto se obtiene un
  • // error de compilación porque se
    intentaría hacer ?Object y puede no ser
    posible (sería posible al haber puesto ? super
    Object)
  • // l5.add(ejemplo) tampoco compila
  • // por el mismo motivo
  • l5.add(null) // compila ya que null es de
    cualquier tipo
  • l1.add(hola)
  • Object obl5.get(0) // sí funciona

38
Dualidad (comodines)/(métodos genéricos)
  • Ejemplo (En clase A)
  • static void fromArrayToArrayList
  • (Object a, ArrayListlt?gt c)
  • for (Object o a)
  • c.add(o)
  • // error de compilación
  • // cannot find symbol
  • static ltTgt void fromArrayToArrayList
  • (T a, ArrayListltTgt c)
  • for (T o a)
  • c.add(o) // correcto
  • Integer numsnew Integer(0), new Integer(1)
  • ArrayListltIntegergt numsArr
  • new ArrayListltIntegergt()
  • A.fromArrayToArrayList(nums, numsArr)
  • System.out.println("Numeros " numsArr)

39
Arrays clases y asignaciones (I)
  • Observación para tener en cuenta en los ejemplos
    siguientes
  • Por cada array hay una clase distinta (obtenida
    mediante getClass, cuya clase padre es
    Object, obtenida mediante getSuperclass)
  • Pero se permiten cosas como
  • ObjectString
  • Sólo se modifica un puntero
  • (Object)E, con el tipo estático de E siendo
    String
  • (String)E, con el tipo estático de E siendo
    Object
  • Puede producir ClassCastException

40
Arrays clases y asignaciones (II)
  • EJEMPLO
  • public static void main(String args)
  • String strings"uno", "dos"
  • Object objects1new Object(), new
    Object(),
  • objects2"uno", "dos"
  • Classlt? extends Objectgt
  • class1strings.getClass(),
  • class2objects1.getClass(),
  • class3objects2.getClass(),
  • class4class1.getSuperclass(),
  • class5class2.getSuperclass(),
  • class6class3.getSuperclass()
  • System.out.println("Clases" class1
    class2 class3
  • class4 class5 class6)
  • objects1strings // correcto
  • // stringsobjects es incorrecto
  • strings(String)objects1

41
Definición de genéricos propios (ejemplo, I)
  • class Singleton ltTgt // conjunto con un único
    elemento
  • T elem
  • Singleton()
  • void añadir(T e )
  • if (elemnull) eleme
  • else
  • System.out.println("Ya lleno")
  • class B ltTgt
  • T elem (T)new Object()
  • void set(T t) elemt T get () return
    elem
  • class Lista ltTgt // ArrayList tiene código
    similar
  • T elementos
  • int num
  • Lista (int n) this.elementos(T)(new
    Objectn)
  • // porque new Tn no compila
  • void añadir(T e)

42
Definición de genéricos propios (ejemplo, II)
  • public class Main
  • public static void main(String args)
  • SingletonltStringgt sinnew
    SingletonltStringgt()
  • sin.añadir("hola") sin.añadir("adios")
  • BltIntegergt unB new BltIntegergt()
  • unB.set(new Integer(3)) Integer junB.get()
  • // SIN CLASSCASTEXCEPTION
  • // Integer o unB.elem ? CLASSCASTEXCEPTION
  • Blt? extends Numbergt otroB new BltIntegergt()
  • // Number o otroB.elem CLASSCASTEXCEPTION
  • Object o otroB.elem // SIN
    CLASSCASTEXCEPTION
  • Lista ltIntegergt a new
    ListaltIntegergt(3)
  • a.añadir(new Integer(3))
    a.añadir(new Integer(4))
  • Integer i a.get(0)
  • // NO PRODUCE CLASS CLASSCASTEXCEPTION
  • Object objetosa.elementos
  • // NO PRODUCE CLASS CLASSCASTEXCEPTION

43
Definición de genéricos propios (ejemplo, III)
  • Observaciones
  • Instrucciones como
  • 1) T elem (T)new Object()
  • dentro de un genérico con parámetro T
  • 2) ArrayListltStringgt l new ArrayList()
  • no producen errores de compilación, pero deben
    usarse con precaución, pues son potencialmente
    generadoras de errores de ClassCastException.
    De hecho el compilador de java emite un mensaje
    del siguiente estilo si se utilizan
  • Note The file Ejemplo.java uses unchecked
    or unsafe operations.

44
Otros detalles para genéricos (I)
  • No admisible para una clase genérica el uso del
    tipo en un método estático
  • class A2 ltT1gt
  • static T1 f () return null
  • // incorrecto
  • La razón es que en este caso se debería utilizar
    un método genérico
  • Posible uso de interfaces en cotas para tipos
    parámetro de genéricos
  • class D ltT1 extends Object ComparableltT1gt
    java.io.Serializable,
  • T2 extends ComparableltT1gtgt
  • // Uso de "" para descendendencia de
    interfaces
  • // Posible uso de "T1" desde su definición
    hasta final de declaración de tipos argumentos
  • class E ltT1 extends ComparableltT1gtgt
  • // en lugar de "" en este caso

45
Otros detalles para genéricos (II)
  • Se puede hacer asignaciones entre tipos con
    comodín
  • ArrayListlt? extends Numbergt l1
  • ArrayListlt? extends Integergt l2
  • l1l2 // correcto
  • l2l1 // incorrecto
  • Casting (T)E a un tipo T con comodín es
    admisible en compilación, si es posible
    Ttipo-de-E o tipo-de-ET
  • Caso especial en método getClass en clase
    Object
  • public final native Classlt? extends Objectgt
    getClass()
  • Pero su tipo estático de retorno es Classlt?
    extends Xgt, siendo X el tipo estático del objeto
  • Ejemplo
  • Classlt? extends Objectgt c hola.getClass()
  • // correcto
  • Classlt? extends Stringgt c hola.getClass() //
    correcto
  • ClassltStringgt c hola.getClass()
  • // incorrecto

46
Excepciones
  • class Ejemplo
  • public static void main(String args)
  • Ejemplo p new Ejemplo ()
  • p.g()
  • System.out.println("Final de método
    main")
  • void f (String s)
  • System.out.println(s.toString())
  • System.out.println("Final de método f")
  • void g ()
  • f(null)
  • System.out.println("Final de método
    g")
  • Build Successful
  • java.lang.NullPointerException
  • at Ejemplo.f(Ejemplo.java8)
  • at Ejemplo.g(Ejemplo.java12)
  • at Ejemplo.main(Ejemplo.java4)

47
Excepc. en tiempo de ejecución
  • java.lang.RuntimeException
  • java.lang.NullPointerException (se ejecuta
  • x.miembro para una variable x con valor
    null)
  • java.lang.IndexOutOfBoundsException (acceso
  • a un índice no existente en un array)
  • java.lang.ArithmeticException (division por
    cero)
  • java.lang.ClassCastException (error de casting)
  • Jerarquia de clases
  • java.lang.Object
  • ----java.lang.Throwable
  • ----java.lang.Exception
  • ----java.lang.RuntimeException
  • ----java.lang.Arithmet
    icException
  • Si ningún método hasta el main atrapa una
    excepción e, se llama a e.printStackTrace()
    (método de java.lang.Throwable)

48
Atrapando excepciones
  • class Ejemplo
  • public static void main(String args)
  • Ejemplo p new Ejemplo() p.g()
  • System.out.println("Final de método main")
  • void f (String s)
  • System.out.println(s.toString())
  • System.out.println("Final de método f")
  • void g ()
  • try
  • System.out.println("Antes de f(null)")
  • f(null)
  • System.out.println("Despues de
    f(null)")
  • catch (NullPointerException e)
  • System.out.println("Excepcion de
    puntero nulo")
  • catch (IndexOutOfBoundsException e)
  • System.out.println("Excepcion de indice
    erroneo")
  • finally
  • System.out.println("Final de bloque
    try")

49
Bloque try-catch
  • Antes de f(null)
  • Excepcion de puntero nulo
  • Final de bloque try
  • Final de método g
  • Final de método main
  • Bloque try-catch-finally permite capturar una
    excepción. Parte finally es opcional. Si hay
    varias partes catch se ejecuta la primera
    posible. El catch utiliza la clase dinámica.
  • Es posible uso de try-finally (sin catch), aunque
    no se puede usar try solo. Se obtendría
  • Antes de f(null)
  • Final de bloque try
  • java.lang.NullPointerException
  • at Ejemplo.f(Ejemplo.java6)
  • at Ejemplo.g(Ejemplo.java12)
  • at Ejemplo.main(Ejemplo.java3)

50
Utilidad de excepciones
  • Excepciones son objetos que definen el estado de
    la aplicación cuando se producen situaciones
    anómalas.
  • Beneficios (erroressituaciones anómalas)
  • 1) Separación entre errores y código normal
  • 2) Propagación de errores en la pila de métodos a
    ejecutar.
  • 3) Agrupación de tipos de errores y
    diferenciación
  • La alternativa en programación sin excepciones es
    el uso de muchos if

51
Clases de excepciones
  • Excepciones en tiempo de ejecución
  • Excepciones comprobadas (no en tiempo de
    ejecución)
  • Predefinidas en Java (java.io.IOException, ...)
  • Definidas por el programa
  • Evitar errores de compilación
  • Si un método puede lanzar una excepción
    comprobada debe especificarlo en su cabecera con
    throws (de la clase de la excepción o de una
    clase ascendente)
  • Puede lanzarla cuando no se hace ningún catch
    que la atrape

52
Excepciones definidas en un programa
  • Se aconseja crearlas como excepciones comprobadas
    (heredan de Exception pero no de
    RunTimeException)
  • Se puede utilizar instrucción throw
    ltexpresion-excepciongt para lanzar la excepción.
  • Parte throws debe ser compatible en tiempo de
    compilación con excepciones lanzadas con throw.
  • La instrucción throw admite cualquier objeto
    Throwable, aunque lo habitual es usar sólo
    excepciones
  • Subclases de Throwable son Error y
    Exception (los errores se refieren a
    situaciones graves)
  • Un catch de una excepción ya capturada es
    inválido (en tiempo de compilación)

53
Ejemplo
  • class Exception2D extends Exception
  • public Exception2D (String mensaje)
  • super(mensaje)
  • // Si algún método (como el main) crea Rectas,
    deberá
  • // o bien hacer throws de Exception2D o bien
  • // atrapar la excepción con bloque try-catch
  • class Recta2D
  • private Punto2D p1, p2
  • private void crearRecta2D (Punto2D p1,
    Punto2D p2)
  • this.p1p1
  • this.p2p2
  • // Recta a partir de dos puntos
  • public Recta2D (Punto2D p1, Punto2D p2)
  • throws Exception2D
  • if (p1.equals(p2)) // definido en clase
    Punto2D
  • throw new Exception2D("Una recta se
    crea con
  • dos puntos distintos")

54
Ejemplo (cont)
  • // Recta axbyc0
  • public Recta2D (double a, double b, double c)
    throws Exception2D
  • if (a0 b0)
  • throw new Exception2D("En una recta
    no puede
  • ser ab0")
  • else if (a0)
  • crearRecta2D(new Punto2D(0, -c/b),
  • new Punto2D(1, -c/b))
  • else if (b0)
  • crearRecta2D(new Punto2D(-c/a, 0),
  • new Punto2D(-c/a, 1))
  • else
  • crearRecta2D(new Punto2D(0, -c/b),
  • new Punto2D(-c/a, 0))
  • public Punto2D interseccion (Recta2D recta)
    throws Exception2D
  • .... throw new Exception2D(Rectas
    paralelas o
  • coincidentes)
  • ....

55
Uso de assert
  • Sintaxis
  • assert condicion
  • Si no se verifica la condición, se emite una
  • java.lang.AssertionError
  • extends java.lang.Error
  • Posible uso en
  • Lugares intermedios de código en los ciertas
    condiciones se cumplen con certeza
  • Precondiciones y postcondiciones en ejecución de
    métodos
  • Por defecto, no se permiten. Es necesario poner
    las opciones
  • javac ea
  • java -ea

56
Clases internas
  • Clases internas
  • anidadas, locales y anónimas
  • Facilidad del lenguaje. Normalmente no se
    utilizan.
  • Clase anidada un miembro de otra clase. Se
    utiliza cuando la clase anidada es local
  • Clase local análogo a las variables locales en
    los métodos
  • Clase anónima se crea una instancia definiendo a
    la vez miembros y sin dar un nombre a la clase
  • Al compilar una clase con clases internas se
    generan varios .class

57
Ejemplo
  • public class Robot
  • private int x
  • private DescripcionRobot descripcion
  • public Robot (int x)
  • this.xx
  • this.descripcionnew DescripcionRobot()
  • // CLASE ANIDADA
  • public class DescripcionRobot
  • private String nombre, color
  • public DescripcionRobot()
  • if (xgt0)
  • this.nombre"A"
  • this.color"blanco"
  • else
  • this.nombreB"
  • this.colorrojo"

58
Ejemplo (cont)
  • public void avanzar (int d)
  • this.xd
  • public int valorX ()
  • return this.x
  • public void asignarX (int x)
  • this.xx
  • public String toString()
  • return "Robot(" this.x ")"
  • - La clase anidada puede ser static (clase
    Robot.DescripcionRobot)
  • - Las clase anidada tiene acceso a los miembros
    de la clase que la contiene
  • - Las instancias se crean, por ejemplo, mediante
  • Robot.DescripcionRobot r
  • (new Robot(3)).new DescripcionRobot()

59
Ejemplo (cont)
  • public class Ejemplo
  • public static void main(String args)
  • Robot r1 , r2, r3
  • //CLASE LOCAL
  • class RobotConFrontera extends Robot
  • private int limX
  • public RobotConFrontera (int limX,
    int x)
  • super(x)
  • this.limXlimX
  • public void avanzar (int a)
  • int huecoX(avalorX())-this.limX
  • if (huecoXgt0)
  • asignarX(avalorX())
  • else asignarX(this.limX-huecoX)
  • r1new RobotConFrontera(0, 1)
  • r1.avanzar(-3)

60
Ejemplo (cont)
  • // CLASE ANONIMA
  • // equivale a new RobotConFrontera(0,2)
  • r2new Robot(2)
  • private int limX0
  • public void avanzar (int a)
  • int huecoX(avalorX())-this.limX
  • if (huecoXgt0)
  • asignarX(avalorX())
  • else asignarX(this.limX-huecoX)
  • r2.avanzar(-3)
  • System.out.println("r2 " r2)

61
Clases internas
  • En una clase interna
  • Se pueden usar las variables accesibles en ese
    instante
  • Se puede utilizar this y
    ltnombre-clasegt.this para desambiguar.
  • En un clase local o anónima, si se utiliza una
    variable local o argumento, debe ser final.
  • Si hay ambigüedad, Java toma siempre la
    referencia más cercana
  • No se pueden poner elementos static
  • En una clase anónima ,se puede hacer new ... de
    algo abstracto (class o interface) , con tal
    que se definan todos sus métodos abstractos
    dentro de dicha clase.
  • Ejemplos de clases anidadas en javax.swing.JEditor
    Pane

62
Alternativas (sin clases internas)
  • public class DescripcionRobot
  • private String nombre, color
  • private int x
  • public DescripcionRobot(int x)
  • if (xgt0)
  • this.nombre"A"
  • this.color"blanco"
  • else
  • this.nombreB"
  • this.colorrojo"
  • public class Robot
  • private int x
  • private DescripcionRobot descripcion
  • public Robot (int x)
  • this.xx

63
Tipos enumerados (I)
  • enum Color ROJO, VERDE
  • enum Comunidad
  • MADR (1, "Comunidad de Madrid"),
  • CASM (5, "Castilla la Mancha")
  • private final int provincias
  • private final String nombre
  • Comunidad (int provincias, String nombre)
  • // no se permite public, al no permitir
    instancias
  • this.provinciasprovincias
  • this.nombrenombre
  • public String descripcion ()
  • return this.toString() ""
    this.provincias ","
  • this.nombre ""
  • public class Main
  • public static void main(String args)
  • Color cc Color.valueOf("ROJO")

64
Tipos enumerados (II)
  • for (Comunidad c Comunidad.values())
  • System.out.println(c.descripcion())
  • switch (cc) // se puede usar en un
    switch
  • case ROJO
  • System.out.println("Color Rojo")
  • break
  • case VERDE
  • System.out.println("Color
    Verde")
  • break
  • ColorROJO
  • Igualtrue
  • ColorVERDE
  • Igualfalse
  • MADR1,Comunidad de Madrid
Write a Comment
User Comments (0)
About PowerShow.com