108
CDI Java Introducción Java Este repaso a Java no es ni completo ni exhaustivo ni suficiente para programar en Java. Debe servir solamente para refrescar conocimiento ya adquerido y para animar de profundizar el estudio del lenguaje con otras fuentes, por ejemplo, con la bibliografía añadida y los manuales correspondientes.

Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Introducción

Java

Este repaso a Java no esni completoni exhaustivoni suficiente

para programar en Java.Debe servir solamente para refrescar conocimiento yaadquerido y para animar de profundizar el estudio del lenguajecon otras fuentes, por ejemplo, con la bibliografía añadida y losmanuales correspondientes.

Page 2: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Introducción

Java

Se destacan ciertas diferencias con C++ (otro lenguaje deprogramación orientado a objetos importante).Se comentan ciertos detalles del lenguaje que muchasveces no se perciben a primera vista.Se introducen los conceptos ya instrínsicos de Java parala programación concurrente.

Page 3: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hola mundo

hola mundo

El famoso hola mundo se programa en Java así:

class Hello {public static void main(String[] args) {System.out.println("Hello world");

}}

El programa principal se llama main() y tiene que serdeclarado público y estático. No devuelve ningún valor (por esose declara como void). Los parámetros de la línea decomando se pasan como un vector de cadenas de letras(String).

Page 4: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Comentarios

¿Qué se comenta?

Existen varias posibilidades de escribir comentarios:

// comentario de línea/// ... comentario de documentación/* ... */ comentario de bloque/** ... */ comentario de documentación

Se usa doxygen o javadoc para generar automáticamentela documentación. Ambos tienen unos comandos paraaumentar la documentación.Se documenta sobre todo lo que no es obvio y lasinterfaceses decir: respuestas a preguntas del ¿Cómo? y del ¿Porqué?.

Page 5: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Programación orientada a objetos

objetos

Java usa (con la excepción de variables de tipos simples)exclusivamente objetos.Un tal objeto se define como una clase (class), y sepuede crear varias instancias de objetos de tal clase.Es decir, la clase define el tipo del objeto, y la instancia esuna variable que representa un objeto.

Page 6: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Programación orientada a objetos

clases

Una clase contiene como mucho tres tipos de miembros:

instancias de objetos (o de tipos simples)métodos (funciones)otras clases

No existen variables globales (como en C++) y el programaprincipal no es nada más que un método de una clase.

Page 7: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Programación orientada a objetos

inicialización

Los objetos en Java siempre tienen valores conocidos, esdecir, los objetos (y también las variables de tipos simples)siempre están inicializados (menos variables locales).Si el programa no da una inicialización explícita, Javaasigna el valor cero, es decir, 0, 0.0, \u0000, false onull dependiendo del tipo de la variable.Variables locales hay que inicializar antes de usarlas, elcódigo se ejecuta cuando la ejecución llega a este punto.

Page 8: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Programación orientada a objetos

Java, C++, C#

Java y C++ (o C#) son hasta cierto punto bastanteparecidos. (por ejemplo, en su síntaxis y gran parte de susmetodologías), aunque también existen grandesdiferencias (por ejemplo, en su no–uso o uso de punterosy la gestión de memoria).Se resaltará algunos de las diferencias principales entreJava y C++.

Page 9: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Programación orientada a objetos

tipos

Java exige una disciplina estricta con sus tipos,es decir, el compilador controla siempre cuando pueda silas operaciones usadas están permitidas con los tiposinvolucrados.Si la comprobación no se puede realizar durante el tiempode compilación, se pospone hasta el tiempo de ejecución,es decir, se pueden provocar excepciones que puedenprovocar fallos durante la ejecución.

Page 10: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de clases I

Se pueden declarar clases con uno o varios de los siguientesmodificadores para especificar ciertas propiedades (no existenen C++):

public la clase es visible desde fuera del ficheroabstract la clase todavía no está completa, es decir, nose puede instanciar objetos antes de que se hayanimplementado en una clase derivada los métodos quefaltanfinal no se puede extender la clasestrictfp obliga a la máquina virtual a cumplir elestándar de IEEE para los números flotantes

Page 11: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de clases II

Casi todos los entornos de desarrollo para Java permitensolamente una clase pública dentro del mismo fichero.Obviamente una clase no puede ser al mismo tiempo finaly abstracta.Tampoco está permitida una clase abstracta constrictfp.

Page 12: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

tipos simples I

boolean o bien true o bien falsechar 16 bit Unicode letrabyte 8 bit número entero con signoshort 16 bit número entero con signoint 32 bit número entero con signolong 64 bit número entero con signofloat 32 bit número flotantedouble 64 bit número flotante

Page 13: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

tipos simples II

Solo float y double son igual como en C++.No existen enteros sin signos en Java (pero si en C++).Los tipos simples no son clases, pero existen para todoslos tipos simples clases que implementan elcomportamiento de ellos.Desde Java 5 la conversión de tipos simples a sus objetoscorrespondientes (y vice versa) es automático.Sólo hace falta escribirles con mayúscula (con laexcepción de Integer).Las clases para los tipos simples proporcionan tambiénvarias constantes para trabajar con los números (porejemplo, NEGATIVE_INFINITY etc.).

Page 14: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

enumeraciones I

hasta Java 1.4 se realizó enumeraciones así:public final int MONDAY=0;public final int TUESDAY=1;public final int ...;

a partir de Java 5 también así:enum Weekdays { MONDAY, TUESDAY, ... }

enum es una clase y automáticamente public, static yfinal (vemos en seguida)tienen toString() y valueOf()

Page 15: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

enumeraciones II

enum es una clase, es decir, se pueden añadir miembros ymétodos

enum Coin {UN(1), DOS(2), CINCO(5), ...private final int value;Coin(int value) { this.value=value; }public int value() { return value; }

}

Page 16: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

enumeraciones III

values() devuelve un vector de los tipos del enumeradolos enum se pueden usar en switch

Coin coin=...;switch(coin) {case UN:case DOS:...

}

Page 17: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de acceso

private: accesible solamente desde la propia clasepackage: (o ningún modificador) accesible solamentedesde la propia clase o dentro del mismo paqueteprotected: accesible solamente desde la propia clase,dentro del mismo paquete, o desde clases derivadaspublic: accesible siempre cuando la clase es visible

(En C++, por defecto, los miembros son privados, mientras enJava los miembros son, por defecto, del paquete.)

Page 18: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de miembros I

Modificadores de miembros siendo instancias de objetos:

final: declara constantes si está delante de tipos simples(diferencia a C++ donde se declara constantes conconst), aunque las constantes no se pueden modificar enel transcurso del programa, pueden ser calculadas durantesus construcciónes; las variables finales, aún declaradassin inicialización, tienen que obtener sus valores comomuy tarde en la fase de construcción de un objeto de laclase

Page 19: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de miembros II

static: declara miembros de la clase que pertenecen ala clase y no a instancias de objetos, es decir, todos losobjetos de la clase acceden a la misma cosa

transient: excluye un miembro del proceso deconversión en un flujo de bytes si el objeto se salva aldisco o se transmite por una conexión (no hay en C++)

Page 20: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de miembros III

volatile: ordena a la máquina virtual de Java que nouse ningún tipo de cache para el miembro, así es másprobable (aunque no garantizado) que varios hilos vean elmismo valor de una variable; declarando variables del tipolong o double como volatile aseguramos que lasoperaciones básicas sean atómicas (este tema veremosmás adelante más en detalle)

Page 21: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de métodos I

Modificadores de miembros siendo métodos:

abstract: el método todavía no está completo, es decir,no se puede instanciar objetos antes de que se hayaimplementado el método en una clase derivada (parecidoa los métodos puros de C++)

static: el método pertenece a la clase y no a un objetode la clase, un método estático puede acceder solamentemiembros estáticos

final: no se puede sobreescribir el método en una clasederivada (no hay en C++)

Page 22: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de métodos II

synchronized: el método pertenece a una región críticadel objeto (no hay en C++)

native: propone una interfaz para llamar a métodosescritos en otros lenguajes, su uso depende de laimplementación de la máquina virtual de Java (no hay enC++, ahí se realiza durante el linkage)

strictfp: obliga a la máquina virtual a cumplir elestándar de IEEE para los números flotantes (no hay enC++, ahí depende de las opciones del compilador)

Page 23: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, tipos y modificadores

modificadores de métodos III

Un método abstracto no puede ser al mismo tiempo nifinal, ni estático, ni sincronizado, ni nativo, ni estricto.Un método nativo no puede ser al mismo tiempo niabstracto ni estricto.Nota que el uso de final y private puede mejorar lasposibilidades de optimización del compilador, es decir, suuso deriva en programas más eficientes.

Page 24: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Estructuras de control y operadores

estructuras de control

Las estructuras de control son casi iguales a las de C++ (notala extensión del for desde Java 5):

if(cond) then block

if(cond) then block else block

while(cond) block

do block while (cond);

for(expr; expr; expr) block

for(type var: array) block

for(type var: collection) block

switch(expr) { case const: ... default: }

Igual que en C++ se puede declarar una variable en laexpresión condicional o dentro de la expresión de inicio delbucle for.

Page 25: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Estructuras de control y operadores

marcas I

Adicionalmente Java proporciona break con una marca quese puede usar para salir en un salto de varios bucles anidados.

mark:while(...) {for(...) {break mark;

}}

Page 26: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Estructuras de control y operadores

marcas II

También existe un continue con marca que permitesaltar al principio de un bucle más alla del actual.No existe el goto (pero es una palabra reservada), su usohabitual en C++ se puede emular (mejor) con los breaks ycontinues y con las secuencias try-catch-finally.

Page 27: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Estructuras de control y operadores

operadores I

Java usa los mismos operadores que C++ con las siguientesexcepciones:

existe adicionalmente >>> como desplazamiento a laderecha llenando con ceros a la izquierdaexiste el instanceof para comparar tipos (C++ tiene unconcepto parecido con typeid)los operadores de C++ relacionados a punteros no existenno existe el delete de C++no existe el sizeof de C++

Page 28: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Estructuras de control y operadores

operadores II

La prioridad y la asociatividad son las mismas que en C++.Hay pequeñas diferencias entre Java y C++ si ciertossímbolos están tratados como operadores o no (porejemplo, los []).Además Java no proporciona la posibilidad de sobrecargaroperadores.

Page 29: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Estructuras de control y operadores

palabras reservadas I

Las siguientes palabras están reservadas en Java:

abstract default if private thisboolean do implements protected throwbreak double import public throwsbyte else instanceof return transientcase extends int short trycatch final interface static voidchar finally long strictfp volatileclass float native super whileconst for new switchcontinue goto package synchronized

Page 30: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Estructuras de control y operadores

palabras reservadas II

Además las palabras null, false y true que sirvencomo constantes no se pueden usar como nombres.Aunque goto y const aparecen en la lista arriba, no seusan en el lenguaje.

Page 31: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, objetos y variables

objetos y referencias a objetos

No se pueden declarar instancias de clases usando elnombre de la clase y un nombre para el objeto (como sehace en C++).La declaración

ClassName ObjectNamecrea solamente una referencia a un objeto de dicho tipo.Para crear un objeto dinámico en el montón se usa eloperador new con el constructor del objeto deseado. Eloperador devuelve una referencia al objeto creado.

ClassName ObjectReference = new ClassName(...)

Page 32: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, objetos y variables

construcción por defecto

Sólo si una clase no contiene ningún constructor Javapropone un constructor por defecto que tiene el mismomodificador de acceso que la clase.Constructores pueden lanzar excepciones como cualquierotro método.

Page 33: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, objetos y variables

constructores

Para facilitar la construcción de objetos aún más, esposible usar bloques de código sin que pertenezcan aconstructores.Esos bloques están prepuestos (en su orden de aparencia)delante de los códigos de todos los constructores.El mismo mecanismo se puede usar para inicializarmiembros estáticos poniendo un static delante delbloque de código.Inicializaciones estáticas no pueden lanzar excepciones.

Page 34: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, objetos y variables

inicialización estática

class ... {...static int[] powertwo=new int[10];static {powertwo[0]=1;for(int i=1; i<powertwo.length; i++)

powertwo[i]=powertwo[i-1]<<1;}...

}

Page 35: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, objetos y variables

inicialización cruzada

Si una clase, por ejemplo, X, construye un miembroestático de otra clase, por ejemplo, Y, y al revés, el bloquede inicialización de X está ejecutado solamente hasta laaparencia de Y cuyos bloques de inicialización recurren alX construido a medias.Nota que todas las variables en Java siempre están encero si todavía no están inicializadas explícitamente.

Page 36: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, objetos y variables

recolector de memoria

No existe un operador para eliminar objetos del montón,eso es tarea del recolector de memoria incorporado enJava (diferencia con C++ donde se tiene que liberarmemoria con delete explícitamente).Para dar pistas de ayuda al recolector se puede asignarnull a una referencia indicando al recolector que no se vaa referenciar dicho objeto nunca jamás.Las referencias que todavía no acceden a ningún objetotienen el valor null.Antes de ser destruido se exejuta el método finalize()del objeto (por defecto no hace nada).

Page 37: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Clases, objetos y variables

reinterpretación de tipos

Está permitida la conversión explícita de un tipo a otromediante la reinterpretación del tipo (“cast”) con todas susposibles consecuencias.El “cast” es importante especialmente en su variante del“downcast”, es decir, cuando se sabe que algún objeto esde cierto tipo derivado pero se tiene solamente unareferencia a una de sus superclases.Se puede comprobar el tipo actual de una referencia conel operador instanceof.

if( refX instanceof refY ) { ... }

Page 38: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Métodos y parámetros

paso de parámetros I

Se pueden pasar objetos como parámetros a métodos.La lista de parámetros junto con el nombre del métodocompone la signatura del método.Pueden existir varias funciones con el mismo nombre,siempre y cuando se distingan en sus signaturas. Latécnica se llama sobrecarga de métodos.

Page 39: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Métodos y parámetros

paso de parámetros II

Hasta Java 1.4 la lista de parámetros siempre era fija, noexistía el concepto de listas de parámetros variables deC/C++.desde Java 5 si existe tal posibilidad.Java pasa parámetros exclusivamente por valor.Eso significa en caso de objetos que siempre se pasa unareferencia al objeto con la consecuencia de que el métodollamado puede modificar el objeto.

Page 40: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Métodos y parámetros

paso de parámetros III

Desde Java 5 existen listas de parámetros variablesvoid func(int fixed, String... names) {...}

Los tres puntos ... significan 0 o más parámetros.Solo el último parámetro puede ser variable.Se accede con el nuevo iterador for:for(String name : names) {...}

Page 41: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Métodos y parámetros

parámetros no modificables no existen

No se puede evitar posibles modificaciones de unparámetro (que sí se puede evitar en C++ declarando elparámetro como const-referencia).Declarando el parámetro como final solamente protegela propia referencia (paso por valor).Entonces, no se pueden cambiar los valores de variablesde tipos simples llamando a métodos y pasarles comoparámetros variables de tipos simples (como es posible enC++ con referencias).La declaración se puede usar como indicación al usuarioque se pretende no cambiar el objeto (aunque elcompilador no lo garantiza).

Page 42: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Métodos y parámetros

valores de retorno

Un método termina su ejecución en tres ocaciones:

se ha llegado al final de su códigose ha encontrado una sentencia return

se ha producido una excepción no tratada en el mismométodo

Un return con parámetro (cuyo tipo tiene que coincidir con eltipo del método) devuelve una referencia a una variable dedicho tipo (o el valor en caso de tipos simples).

Page 43: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Vectores (arrays)

vectores

Los vectores se declaran solamente con su límite súperiordado que el límite ínferior siempre es cero (0).El código

int[] vector = new int[15]crea un vector de números enteros de longitud 15.

Page 44: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Vectores (arrays)

control de acceso

Java comprueba si los accesos a vectores con índicesquedan dentro de los límites permitidos (diferencia conC++ donde no hay una comprobación).Si se detecta un acceso fuera de los límites se produceuna excepción IndexOutOfBoundsException.Dependiendo de las capacidades del compilador esopuede resultar en una pérdida de rendimiento.

Page 45: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Vectores (arrays)

vectores son objetos

Los vectores son objetos implícitos que siempre conocensus propias longitudes (values.length) (diferencia conC++ donde un vector no es nada más que un puntero) yque se comportan como clases finales.No se pueden declarar los elementos de un vector comoconstantes (como es posible en C++), es decir, elcontenido de los componentes siempre se puede modificaren un programa en Java.

Page 46: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

this and super

Cada objeto tiene por defecto una referencia llamadathis que proporciona acceso al propio objeto (diferenciaa C++ donde this es un puntero).Obviamente, la referencia this no existe en métodosestáticos.Cada objeto (menos la clase object) tiene una referenciaa su clase súperior llamada super (diferencia a C++donde no existe, se tiene acceso a las clases superiorespor otros medios).this y super se pueden usar especialmente paraacceder a variables y métodos que están escondidos pornombres locales.

Page 47: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

más sobre constructores

Para facilitar las definiciones de constructores, unconstructor puede llamar en su primer sentencia

o bien a otro constructor con this(...)o bien a un constructor de su superclase con super(...)(ambos no exiten en C++).

El constructor de la superclase sin parámetros estállamado en todos los casos al final de la posible cadena dellamadas a constructores this() en caso que no hayauna llamada explícita.

Page 48: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

orden de construcción

La construcción de objetos sigue siempre el siguiente orden:

construcción de la superclase, nota que no se llamaningún constructor por defecto que no sea el constructorsin parámetrosejecución de todos los bloques de inicializaciónejecución del código del constructor

Page 49: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

extender clases I

Se puede crear nuevas clases a partir de la extención declases ya existentes (en caso que no sean finales). Lasnuevas clases se suelen llamar subclases o clasesextendidas.Una subclase heredará todas las propriedades de la clasesúperior, aunque se tiene solamente acceso directo a laspartes de la superclase declaradas por lo menosprotected.

Page 50: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

extender clases II

No se puede extender al mismo tiempo de más de unaclase súperior (diferencia a C++ donde se puede derivarde más de una clase).Se pueden sobreescribir métodos de la superclase.Si se ha sobreescrito una cierta función, las demásfunciones con el mismo nombre (pero diferente signatura)siguen visibles desde la clase derivada (en C++ eso no esel caso).Dicho último aspecto puede provocar sorpresas...¿Cuáles?

Page 51: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

acceso a métodos sobreescritos

Si se quiere ejecutar dentro de un método sobreescrito elcódigo de la superclase, se puede acceder el métodooriginal con la referencia super.Se puede como mucho extender la accesibilidad demétodos sobreescritos.Se pueden cambiar los modificadores del método.También se puede cambiar si los parámetros del métodoson finales o no, es decir, final no forma parte de lasignatura (diferencia a C++ donde const forma parte dela signatura).

Page 52: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

sobreescritura y excepciones

Los tipos de las excepciones que lanza un métodosobreescrito tienen que ser un subconjunto de los tipos delas excepciones que lanza el método de la superclase.Dicho subconjunto puede ser el conjunto vacio.Si se llama a un método dentro de una jerarquia de clases,se ejecuta siempre la versión del método que correspondeal objeto creado (y no necesariamente al tipo de referenciadado) respetando su accesibilidad.Está técnica se llama polimorfismo.

Page 53: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

clases dentro de clases

Se pueden declarar clases dentro de otras clases.Sin embargo, dichas clases no pueden tener miembrosestáticos no–finales.Todos los miembros de la clase contenedora están visiblesdesde la clase interior (diferencia a C++ donde hay quedeclarar la clase interior como friend para obtener dichoefecto).

Page 54: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

clases locales

Dentro de cada bloque de código se pueden declarar claseslocales que son visibles solamente dentro de dicho bloque.

Page 55: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

la clase Object I

Todos los objetos de Java son extensiones de la clase Object.Los métodos públicos y protegidos de esta clase son

public boolean equals(Object obj)compara si dos objetos son iguales, por defecto un objetoes igual solamente a si mismopublic int hashCode() devuelve (con altaprobabilidad) un valor distinto para cada objetoprotected Object clone() throwsCloneNotSuportedException devuelve una copiabinaria del objeto (incluyendo sus referencias)

Page 56: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

la clase Object II

public final Class getClass() devuelve el objetodel tipo Class que representa dicha clase durante laejecuciónprotected void finalize() throws Throwablese usa para finalizar el objeto, es decir, se avisa aladministrador de la memoria que ya no se usa dichoobjeto, y se puede ejecutar código especial antes de quese libere la memoriapublic String toString() devuelvo una cadenadescribiendo el objeto

Las clases derivadas deben sobreecribir los métodosadecuadamente, por ejemplo el método equals, si se requiereuna comparación binaria.

Page 57: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

interfaces

Usando interface en vez de class se define unainterfaz a una clase sin especificar el código de losmétodos.Una interfaz no es nada más que una especificación decómo algo debe ser implementado para que se puedausar en otro código.Una interfaz solo puede tener declaraciones de objetosque son constantes (final) y estáticos (static).En otras palabras, todas las declaraciones de objetosdentro de interfaces automáticamente son finales yestáticos, aunque no se haya descrito explícitamente.

Page 58: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

interfaces y herencia

Igual que las clases, las interfaces pueden incorporar otrasclases o interfaces.También se pueden extender interfaces.Nota que es posible extender una interfaz a partir de másde una interfaz:

interface ThisOne extends ThatOne, OtherOne { ... }

Page 59: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

métodos de interfaces

Todos los métodos de una interfaz son implícitamentepúblicos y abstractos, aunque no se haya descrito nipublic ni abstract explícitamente (y eso es laconvención).Los demás modificadores no están permitidos paramétodos en interfaces.Para generar un programa todas las interfaces usadastienen que tener sus clases que las implementen.

Page 60: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

implementación de interfaces

Una clase puede implementar varias interfaces al mismotiempo (aunque una clase puede extender como muchouna clase).Se identifican las interfaces implementadas conimplements después de una posible extensión(extends) de la clase.

Page 61: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

implementación

public interface Comparable {int compareTo(Object o);

}

class Something extends Anythingimplements Comparable

{ ...public int compareTo(Object o) {

// cast to get a correct object// may throw exception ClassCastException

Something s = (Something)o;... // code to compare to somethings

}}

Page 62: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Construcción, extención, interfaces, herencia

resumen: interfaces

Las interfaces se comportan como clases totalmenteabstractas, es decir,

no tienen miembros no–estáticos,nada diferente a público,y ningún código no–estático.

Page 63: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

tipos como variables

Como ya existía en C++, se introdujo la posibilidad de usartipos como variables en la definición de clases y métodos.Se realiza con una sintaxis parecida:List<Animal> farm=new ArrayList<Animal>();

Con eso se evita las muchas transformaciones explícitasde tipos que antes su usaba sobre todo para agruparobjetos en colecciones.Es decir, se puede disenar estructuras de datos sinespecificar antemano con que tipo se trabrajá en concreto.Cuando se usa el compilador garantiza que el tipoconcreto proporciona las propiedades necesarias.

Page 64: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

clases genéricas

class Something<T> {T something;public Something(T something) {this.something=something;

}public void set(T something) {this.something=something;

}public T get() {return something;

}}

Page 65: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

uso de clase genérica

Usamos la clase Something con cadenas.Construcción:

Something<String> w=new Something<String>("word");

Leer el “contenido”:String s=w.get();

Escribir el “contenido”:w.set(new Double(10.0));

producerá un fallo de compilación, hay que usar unacadena como parámetro.

Page 66: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

métodos genéricos

class Anything {public <T> T get(T something) {return something;

}public static <T> void write(T something) {out.println(something);

}}

Con métodos genéricos se pueden implementarfuncionalidades que se quieren realizar con cualquier tipo deinterés.

Page 67: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

polimorfismo paramétrico restringido

Se puede declarar el tipo que se usa para especificar untipo genérico asumiendo cierta herencia:

List<T extends Animal>

Así en el uso del tipo T ya se sabe algo sobre susfuncionalidades (y el compilador lo comprueba).

Page 68: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

polimorfismo paramétrico anidado/encadenado

Se puede expresar también que el tipo genérico seheredera de otro tipo genérico:

List<T extends Animal<E>>

o que el tipo genérico ya viene dado por otro tipo genéricoLinkedList<LinkedList<T>>

Page 69: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

limitaciones del polimorfismo paramétrico

No se puede instanciar un objeto de un tipo genérico, sinoes dentro de una clase o método del mismo, es decir,T e=new T(); está prohibidoList<T> L= new LinkedList<T>(); está permitido.

Page 70: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

polimorfismo paramétrico con comodín I

Observa: List<Object> no es superclase deList<String>.Entonces, para escribir métodos (y clases) que trabajencon cualquier tipo genérico necesitamos una notaciónnueva:List<?>

sirve para implementar por ejemplovoid write(List<?> L) {for(Object e : L) out.println(e);

}

Page 71: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

polimorfismo paramétrico con comodín II

Los comodines adquieren forma en su construcción:Collection<?> C = new ArrayList<String>();

ahora la colección C contiene cadenas.Solo null se puede asignar a una variable del tipocomodín, siempre.Eso no funciona para pasar parámetros:

<T> void add(Set<T> s, T t) {...}no se puede usar con un conjunto construidogenéricamenteadd(new Set<String>(), new String("hi"));

Page 72: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

polimorfismo paramétrico con comodín III

Los comodines se pueden usar también para expresar lapropia cadena de herencia que se quiere mantener:Collection<? extends Shape> C= new ArrayList<Circle>();

donde Circle tiene que ser un tipo cuya superclase esShape.Dicho concepto se llama comodín limitado.Pero ya no existe la posibilidad de escribir (la relación noes reflexiva)Collection<? extends Shape> C= new ArrayList<Shape>();

Page 73: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

polimorfismo paramétrico con comodín IV

También se puede limitar el comodín desde abajo:Collection<? super Circle> C= new ArrayList<Shape>();

Aquí sí se puede escribirCollection<? super Circle> C= new ArrayList<Circle>();

dado que la relación es reflexiva.

Page 74: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

polimorfismo paramétrico con comodín V

Los tipos genéricos (tanto comodín o no-comodín) setransforman en tipos simples antes de la ejecución.Por eso no se tiene acceso a la variable del tipo, con laconsecuencia queList<String> S=new ArrayList<String>();List<Integer> I=new ArrayList<Integer>();out.println(S.getClass()==I.getClass());

imprime true.Tampoco se puede averiguar el tipo, el siguiente código nocompila:Collection<String> S=new ArrayList<String>();if(S instanceof Collection<String>) \{...\}

Page 75: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Polimorfismo paramétrico

polimorfismo paramétrico con comodín VI

Hay que tomarse muy en serio posibles mensajes de avisocuando se usa tipos genéricos y cambiar el código hastaque no aparezca ninguno.Sino, puede ocurrir una simple excepción de fallo enconversión de tipo en algún momento de la ejecución cuyarazón será difícil de localizar.

Page 76: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Excepciones

try’n’catch

Para facilitar la programación de casos excepcionales Javausa el concepto de lanzar excepciones.Una excepción es una clase predefinida y se accede conla sentencia

try { ... }catch (SomeExceptionObject e) { ... }catch (AnotherExceptionObject e) { ... }finally { ... }

Page 77: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Excepciones

orden de ejecución I

El bloque try contiene el código normal por ejecutar.Un bloque catch(ExceptionObject) contiene elcódigo excepcional por ejecutar en caso de que durante laejecución del código normal (que contiene el bloque try)se produzca la excepción del tipo adecuado.Pueden existir más de un (o ningún) bloque catch parareaccionar directamente a más de un (ningún) tipo deexcepción.Hay que tener cuidado en ordenar las excepcionescorrectamente, es decir, las más específicas antes de lasmás generales.

Page 78: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Excepciones

orden de ejecución II

El bloque finally se ejecuta siempre una vez terminadoo bien el bloque try o bien un bloque catch o bien unaexcepción no tratada o bien antes de seguir un break, uncontinue o un return hacia fuera de la sentenciatry-catch-finally.

Page 79: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Excepciones

construcción de clases de excepción

Normalmente se extiende la clase Exception paraimplementar clases propias de excepciones, aún también sepuede derivar directamente de la clase Throwable que es lasuperclase (interfaz) de Exception o de la claseRuntimeException.

class MyException extends Exception {public MyException() { super(); }public MyException(String s) { super(s); }

}

Page 80: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Excepciones

declaración de excepciones lanzables

Entonces, una excepción no es nada más que un objetoque se crea en el caso de aparición del caso excepcional.La clase principal de una excepción es la interfazThrowable que incluye un String para mostrar unalínea de error legíble.Para que un método pueda lanzar excepciones con lassentencias try-catch-finally, es imprecindibledeclarar las excepciones posibles antes del bloque decódigo del método con throws ....

public void myfunc(...) throws MyException {...}

En C++ es al revés, se declara lo que se puede lanzarcomo mucho.

Page 81: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Excepciones

propagación de excepciones

Durante la ejecución de un programa se propagan lasexcepciones desde su punto de aparición subiendo lasinvocaciones de los métodos hasta que se hayaencontrado un bloque catch que se ocupa de tratar laexcepción.En el caso de que no haya ningún bloque responsable, laexcepción será tratada por la máquina virtual con elposible resultado de abortar el programa.

Page 82: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Excepciones

lanzar excepciones

Se pueden lanzar excepciones directamente con lapalabra throw y la creación de un nuevo objeto deexcepción, por ejemplo:

throw new MyException(“eso es una excepcion”);

También los constructores pueden lanzar excepciones quetienen que ser tratados en los métodos que usan dichosobjetos construidos.

Page 83: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Excepciones

excepciones de ejecución

Además de las excepciones así declaradas existensiempre excepciones que pueden ocurrir en qualquiermomento de la ejecución del programa, por ejemplo,RuntimeException o Error oIndexOutOfBoundException.La ocurrencia de dichas excepciones refleja normalmenteun flujo de control erróneo del programa que se debecorrigir antes de distribuir el programa a posibles usuarios.Se usan excepciones solamente para casosexcepcionales, es decir, si pasa algo no esperado.

Page 84: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Paquetes

agrupación de objetos I

Siempre existe la posibilidad de que diferentes fuentesusen el mismo nombre para una clase.Para producir nombres únicos se agrupa los objetos enpaquetes.El nombre del paquete sirve como prefijo del nombre de laclase con la consecuencia de que cuando se diferencianlos nombres de los paquetes también se diferencian losnombres de las clases.

Page 85: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Paquetes

agrupación de objetos II

Por convención se usa como prefijo el dominio en interneten orden inverso para los paquetes.Hay que tener cuidado en distinguir los puntos en elnombre del paquete con los puntos que separan losmiembros de una clase.La pertenencia de una clase a un paquete se indica en laprimera sentencia de un fichero fuente conpackage Pack.Name;

Page 86: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Paquetes

agrupación de objetos III

Java viene con una amplia gama de clases y paquetespredefinidos.Se accede a los paquetes con import.Se accede a los componentes de los paquetes conclasificadores, p.ej., System.out.println(...)(desde Java 5 ya no hace falta clasificar, se importa comoimport static java.lang.System.*).Cuidado: Java no está disponible siempre en todas lasplataformas en su última versión y eso puede derivar enaplicaciones no portables.

Page 87: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Reflexión

acceso a si mismo

Java proporciona para cada clase un objeto de tipo Classque se puede usar para obtener información sobre lapropia clase y todos sus miembros.Así por ejemplo se puede averiguar todos los métodos ymodificadores, cual es su clase súperior y mucho más.

Page 88: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

objetivos

Se usan los hilos para ejecutar varias secuencias deinstrucciones de modo cuasi–paralelo.

Page 89: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

creación de un hilo (para empezar)

Se crea un hilo conThread worker = new Thread()

Después se inicializa el hilo y se define sucomportamiento.Se lanza el hilo con

worker.start()

Pero en esta versión simple no hace nada. Hace faltasobreescribir el método run() especificando algún códigoútil.

Page 90: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

la interfaz Runnable

A veces no es conveniente extender la clase Threadporque se pierde la posibilidad de extender otro objeto.Es una de las razones por que existe la interfaz Runnableque declara nada más que el método public voidrun() y que se puede usar fácilmente para crear hilostrabajadores.

Page 91: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

pingPONG I

class RunPingPONG implements Runnable {private String word;private int delay;

RunPingPONG(String whatToSay, int delayTime) {word =whatToSay;delay=delayTime;

}

Page 92: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

pingPONG II

public void run() {try {

for(;;) {System.out.print(word+" ");Thread.sleep(delay);

}}catch(InterruptedException e) {return;

}}

Page 93: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

pingPONG III

public static void main(String[] args) {Runnable ping = new RunPingPONG("ping", 40);Runnable PONG = new RunPingPONG("PONG", 50);new Thread(ping).start();new Thread(PONG).start();

}}

Page 94: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

construcción de Runnables

Existen cuatro constructores para crear hilos usando la interfazRunnable.

public Thread(Runnable target)así lo usamos en el ejemplo arriba, se pasa solamente laimplementación de la interfaz Runnablepublic Thread(Runnable target, String name)se pasa adicionalmente un nombre para el hilopublic Thread(ThreadGroup group, Runnabletarget)construye un hilo dentro de un grupo de hilospublic Thread(ThreadGroup group, Runnabletarget, String name)construye un hilo con nombre dentro de un grupo de hilos

Page 95: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

implementación de Runnable

La interfaz Runnable exige solamente el método run(),sin embargo, normalmente se implementan más métodospara crear un servicio completo que este hilo debe cumplir.Aunque no hemos guardado las referencias de los hilos enunas variables, los hilos no caen en las manos delrecolector de memoria: siempre se mantiene unareferencia al hilo en su grupo al cual pertenece.El método run() es público y en muchos casos,implementando algún tipo de servicio, no se quiere darpermiso a otros ejecutar directamente el método run().Para evitar eso se puede recurrir a la siguienteconstrucción:

Page 96: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

run() no-público

class Service {private Queue requests = new Queue();public Service() {

Runnable service = new Runnable() {public void run() {

for(;;) realService((Job)requests.take());}

};new Thread(service).start();

}public void AddJob(Job job) {

requests.add(job);}private void realService(Job job) {

// do the real work}

}

Page 97: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos

explicación del ejemplo

Crear el servicio con Service() lanza un nuevo hilo queactua sobre una cola para realizar su trabajo con cadatarea que encuentra ahí.El trabajo por hacer se encuentra en el método privadorealService().Una nueva tarea se puede añadir a la cola conAddJob(...).Nota: la construcción arriba usa el concepto de clasesanónimas de Java, es decir, sabiendo que no se va a usarla clase en otro sitio que no sea que en su punto deconstrucción, se declara directamente donde se usa.

Page 98: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

sincronización

En Java es posible forzar la ejecución del código en unbloque en modo sincronizado, es decir, como mucho unhilo puede ejecutar algún código dentro de dicho bloque almismo tiempo.

synchronized (obj) { ... }

La expresión entre paréntesis obj tiene que evaluar a unareferencia a un objeto o a un vector.Declarando un método con el modificador synchronizedgarantiza que dicho método se ejecutaininterrumpidamente por un sólo hilo.La máquina virtual instala un cerrojo (mejor dicho, unmonitor, ya veremos dicho concepto más adelante) que secierra de forma atómica antes de entrar en la región críticay que se abre antes de salir.

Page 99: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

métodos syncronizados

Declarar un método comosynchronized void f() { ... }

es equivalente a usar un bloque sincronizado en suinterior:void f() { synchronized(this) { ... } }

Los monitores permiten que el mismo hilo puede accedera otros métodos o bloques sincronizados del mismo objetosin problema.Se libera el cerrojo sea el modo que sea que termine elmétodo.Los constructores no se pueden declarar synchronized.

Page 100: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

syncronización y herencia

No hace falta mantener el modo sincronizadosobreescribiendo métodos síncronos mientras se extiendeuna clase. (No se puede forzar un método sincronizada enuna interfaz.)Sin embargo, una llamada al método de la clase súperior(con super.) sigue funcionando de modo síncrono.Los métodos estáticos también pueden ser declaradossynchronized garantizando su ejecución de maneraexclusiva entre varios hilos.

Page 101: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

protección de miembros estáticos

En ciertos casos se tiene que proteger el acceso a miembrosestáticos con un cerrojo. Para conseguir eso es posiblesincronizar con un cerrojo de la clase, por ejemplo:

class MyClass {static private int nextID;...MyClass() {synchronized(MyClass.class) {

idNum=nextID++;}

}...

}

Page 102: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

¡Ojo con el concepto!

Declarar un bloque o un método como síncrono solo preveeque ningún otro hilo pueda ejecutar al mismo tiempo dicharegión crítica, sin embargo, cualquier otro código asíncronopuede ser ejecutado mientras tanto y su acceso a variablescríticas puede dar como resultado fallos en el programa.

Page 103: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

objetos síncronos

Se obtienen objetos totalmente sincronizados siguiendo lasreglas:

todos los métodos son synchronized,no hay miembros/atributos públicos,todos los métodos son final,se inicializa siempre todo bien,el estado del objeto se mantiene siempre consistenteincluyiendo los casos de excepciones.

Page 104: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

páginas del manual

Se recomienda estudiar detenidamente las páginas del manualde Java que estén relacionados con el concepto de hilo.

Page 105: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

atomicidad en Java

Solo las asignaciónes a variables de tipos simples de 32bits son atómicas.long y double no son simples en este contexto porqueson de 64 bits, hay que declararlas volatile paraobtener acceso atómico.

Page 106: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

limitaciones para la programación concurrente

no se puede interrumpir la espera a un cerrojo (una vezllegado a un synchronized no hay vuelta atrás)no se puede influir mucho en la política del cerrojo(distinguir entre lectores y escritores, diferentes justicias,etc.)no se puede confinar el uso de los cerrojos (en cualquierlínea se puede escribir un bloque sincronizado decualquier objeto)no se puede adquirir/liberar un cerrojo en diferentes sitios,se está obligado a un estructura de bloques

Page 107: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

paquete especial para la programación concurrente

Por eso se ha introducido desde Java 5 un paqueteespecial para la programación concurrente.

java.util.concurrent

Hay que leer todo su manual.

Page 108: Java - Universidade de Vigoformella.webs.uvigo.es/doc/cdg11/java.pdf · 2014-08-29 · CDI Java Programación orientada a objetos inicialización Los objetos en Java siempre tienen

CDI

Java

Hilos y concurrencia

resumen respecto a concurrencia

(transient)volatilesynchronizedtry-catch-finallyfinalizeThread, Runnablejava.util.concurrentjava.util.concurrent.atomic