Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
Curso Java Resumen - Curso 2005-2006
1. 22/06/2005 Java - Samuel Marrero Lorenzo 1
Programacion Orientada a
Objetos
Caso practico: Java
2. 22/06/2005 2
Indice
Introducción a Java
Características de Java
Compilacion Java
Preparación del entorno de desarrollo
PrimerPrograma.java
Sintaxis
Paradigmas de software
Programación orientada a objetos
Arrays
Características avanzadas de la orientación a objetos
Características avanzadas del lenguaje
Excepciones
Entrada/salida
Clases útiles
Threads
Programacion grafica
3. 22/06/2005 3
Introducción a Java
Sun Microsystems, líder en servidores para Internet, uno
de cuyos lemas desde hace mucho tiempo es "the
network is the computer" (lo que quiere dar a entender
que el verdadero ordenador es la red en su conjunto y no
cada máquina individual), es quien ha desarrollado el
lenguaje Java
Este lenguaje tiene como propósito los problemas que se
le plantean a los desarrolladores de software por la
proliferación de arquitecturas incompatibles:
tanto entre las diferentes máquinas como
entre los diversos sistemas operativos y sistemas de
ventanas que funcionaban sobre una misma máquina,
añadiendo la dificultad de crear aplicaciones distribuidas
en una red como Internet.
4. 22/06/2005 4
Antecedentes de Java
1991: Sun Microsystems diseña un lenguaje diseñado para
sistemas embebidos,(set-top-boxes), electrodomésticos.
Lenguaje sencillo, pequeño, neutro.
Ninguna empresa muestra interés por el lenguaje
1995: Java se introduce en Internet, lenguaje muy apropiado
Netscape 2.0 introduce la primera JVM en un navegador WWW
(Máquina virtual Java)
Filosofía Java: “Write once, run everywhere”
1997: Aparece Java 1.1. Muchas mejoras respecto a 1.0
1998: Java 1.2 (Java 2). Plataforma muy madura
Apoyado por grandes empresas: IBM, Oracle, Inprise,
Hewtlett-Packard, Netscape, Sun
1999: Java Enterprise Edition. Java comienza a ser una
plataforma de desarrollo profesional.
5. 22/06/2005 5
Caracteristicas de Java (l)
Sun describe Java como un lenguaje “simple, orientado a objetos,
distribuido, interpretado, robusto, seguro, de arquitectura neutra,
portable, de altas prestaciones, multitarea y dinámico”
SIMPLE: elimina las dificultades de otros lenguajes como el uso y
aritmetica de punteros, y la necesidad de liberar memoria (free).
FAMILIAR: Similar sintaxis a la de C++
ORIENTADO A OBJETOS: soportando las caracteristicas de un
lenguaje orientado a objetos
DISTRIBUIDO: permite que pueda correr en red
ROBUSTO: con metodos tales como una fuerte comprobacion de tipos
y no usar punteros impide al programa bloquear al sistema
6. 22/06/2005 6
Caracteristicas de Java (ll)
SEGURO: un programa no puede acceder a los recursos del sistema de
manera incontrolada al comprobar los castings e impedir la aritmetica
de punteros
PORTABLE: una vez compilado puede ser ejecutado en cualquier otra
maquina con una JVM instalada
INTERPRETADO: es mitad compilado (byte-code) y mitad
interpretado (JVM), por eso es mas lento que C, pero mas rapido que
muchos otros lenguajes
MULTITHREAD: soporta la concurrencia a traves de hilos de
ejecucion (flujos de control concurrentes)
DINAMICO: al ser un lenguaje orientado a objetos
7. 22/06/2005 7
Java frente a otros lenguajes
Desventajas frente a otros:
Lenguaje de rendimiento inferior a C debido al
mayor consumo de memoria (JVM) y a su
interpretacion.
Ventajas frente a otros:
Soporta threads de modo nativo
Distribuido u orientado a web por su
independencia de la plataforma (maquina y SO)
Sencillo y robusto
9. 22/06/2005 9
Tipos de aplicaciones Java
Aplicaciones
– Con o sin interfaz gráfico
Applet
– Aplicaciones que pueden correr dentro de
un navegador de internet
Servlets
– Aplicaciones que corren en un servidor
WWW
JavaBeans
– Componentes combinables
10. 22/06/2005 10
Compilacion Java
Java es un lenguaje mitad compilado y mitad
interpretado.
1. Compilacion: en cualquier maquina
Codigo_fuente.java Codigo_objeto.class
(lenguaje Java) (byte-code)
2. Interpretacion: en una maquina concreta con la JVM
Codigo_objeto.class Proceso ejecutado con la
JVM para dicha maquina
11. 22/06/2005 11
Herramientas de desarrollo
Java
Para poder desarrollar en Java 2:
1. j2sdk1.4.2_04: es el kit de desarrollo de software de Java
2 que vamos a utilizar. Se puede descargar en
java.sun.com
2. IDE: entorno de desarrollo como Eclipse o un editor de
texto plano tipo Bloc de Notas
Para poder ejecutar aplicaciones Java (JVM):
jre: entorno de ejecucion o máquina virtual de Java
12. 22/06/2005 12
Preparación del entorno de
desarrollo
Una vez obtenido el kit de desarrollo hay que preparar Windows para que
puedan ejecutarse las aplicaciones. Dos formas:
1. MiPC Propiedades Avanzadas Variables de entorno
Añadir a la variable Path la ruta donde se encuentran los comandos
de java. En este caso:
Path = %Path%;c:j2sdk1.4.2_04bin
2. MiPC Avanzadas Variables de entorno
Añadir a la variable ClassPath la ruta donde se encuentran las
clases. En este caso en el directorio actual donde compilamos:
set CLASSPATH=.;%CLASSPATH%
13. 22/06/2005 13
Formato de los ficheros fuente
El fichero fuente contiene 3 elementos principales:
Declaración de paquete (opcional)
Sentencias de importación (opcional)
Declaración de clase o de interfaz
Ejemplo: fichero fuente PrimerPrograma.java
import java.io.*;
public class PrimerPrograma
{
...
}
14. 22/06/2005 14
PrimerPrograma.java
// Aplicación de consola de ejemplo PrimerPrograma
import java.io.*;
class PrimerPrograma
{
public static void main( String args[] ) //Función principal
{
System.out.println( “Este es mi primer programa, ☺" );
}
}
C:javaPrimerPrograma.java
____________________________________________________
Resultado: Imprime en pantalla el mensaje de texto.
15. 22/06/2005 15
Ejemplo de compilación y
ejecución de un programa
Creamos un programa en java, compuesto de una clase de
nombre PrimerPrograma. El programa fuente por lo tanto es
PrimerPrograma.java
1. Compilación:
C:java>javac PrimerPrograma.java
Obteniéndose PrimerPrograma.class
2. Ejecución (interpretación)
C:java>java PrimerPrograma
NOTA: Atención minúsculas y mayúsculas
16. 22/06/2005 16
Características del Lenguaje
y sintáxis
Sensible a mayúsculas/minúsculas
Soporta comentarios //, /*…*/
Lenguaje de formato libre
Permite identificadores todos menos vocales acentuadas,
signos de puntuacion y palabras reservadas
Incluye palabras reservadas
Permite variables y constantes las primeras pueden cambiar
su valor y las segundas no
Convenciones de nomenclatura Clases: comienzan en
mayuscula, Metodos y Variables: comienzan en minuscula,
Constantes: todo en mayusculas
Tiene reglas sobre los tipos de datos
17. 22/06/2005 17
Tipos de Datos
Java define dos tipos de datos:
Tipos primitivos
Tipos referencia
Los tipos primitivos son ocho agrupados en
cuatro categorías:
lógico: boolean valores true y false
texto: char
entero: byte, short, int, long
real: float, double
Los tipos referencia son punteros a objetos
18. 22/06/2005 18
Tipo de Datos Referencia
Un tipo referencia guarda un puntero a la dirección donde se
ubica el objeto (32 bits)
Sólo puede almacenar direcciones de objetos de su propio tipo
Ejemplo:
Ordenador pc , sun ;
Usuario user ;
pc = new Ordenador ( ) ; //Crea un objeto de la clase Ordenador
user = pc ; //Error de compilación
sun = pc ; //Correcto
Todas las clases son de tipo referencia
El valor que toma por defecto una variable de tipo referencia es
null
19. 22/06/2005 19
Cadenas de caracteres
La clase String permite manejar cadenas de caracteres
El literal String debe ir entre comillas dobles “ ”
Se puede crear una cadena de caracteres de dos formas:
String nombre = new String(“Pepe”);
String nombre = “Pepe”;
Para concatenar dos cadenas se utiliza el operador +
“Pepe” + “Pérez” = “PepePérez”
No se guarda el carácter de fin de cadena
20. 22/06/2005 20
Operadores Java (l)
Operadores unarios: +, -
Operadores aritméticos: +, -, *, /, % (resto de la división)
Operadores de asignación: =, +=, -=, *=, /=, %=
<var> += <expr> equivale a <var> = <var> + <expr>
Operadores incrementales: ++, --
precediendo a la variable: ++<var>, --<var>
siguiendo a la variable: <var>++, <var>--
i=6; i=6; i=6; i=6;
j=i++; equivale a j=i; i++;
j=++i; equivale a i=i+1; j=i;
dando como resultado i=7 , j=6 i=7 , j=7
21. 22/06/2005 21
Operadores Java (ll)
Operadores relacionales:
== (igual), != (distinto), >, <, >=, <=
Operadores lógicos: && (AND), || (OR), ! (NOT)
&& y || realizan evaluación perezosa:
op1 && op2 si op1 es false, no se evalúa op2
op1 || op2 si op1 es true, no se evalúa op2
Operador instanceof: <objeto> instanceof <clase>
determina si un objeto pertenece a una clase
22. 22/06/2005 22
Operadores Java (lll)
Operador condicional:
? :<exprBooleana> ? <valor1> : <valor2>
Permite bifurcaciones condicionales sencillas
Operadores a nivel de bits: >>, <<, >>>, &, |, ^, ~
op1 >> n desplaza los bits de op1 (con signo) a la derecha n
posiciones
op1 << n desplaza los bits de op1 (con signo) a la izquierda n
posiciones
op1 >>> n desplaza los bits de op1 (sin signo) a la derecha n
posiciones
op1 & op2 Operador AND a nivel de bits
op1 | op2 Operador OR a nivel de bits
op1 ^ op2 Operador XOR a nivel de bits
~op1 Operador complemento (NOT a nivel de bits)
23. 22/06/2005 23
Estructuras de control
Las sentencias de control del flujo de ejecución
permiten tomar decisiones y realizar un proceso
repetidas veces
Hay tres tipos principales de sentencias de control de
flujo:
Condicionales: if, switch
Bucles: for, while, do while
Otras sentencias que permiten interrumpir el flujo
normal de ejecución son break y continue
24. 22/06/2005 24
Sentencias condicionales: if
Si <condicion> entonces
Acciones_Si
Si no
Acciones_No
Fin si
Equivale a (en Java todas las sentencias en minúscula)
if(condición)
{
Acciones_Si;
}
else El grupo de sentencia else y Acciones_No es opcional
{
Acciones_No;
}
25. 22/06/2005 25
Sentencias condicionales:
switch
Según variable hacer
Caso valor1: Acciones_1
Caso valor2: Acciones_2
En otro caso: Acciones_Otro_Caso
Fin según
Equivale a:
switch(variable) variable char o int
{
case valor1: Acciones_1;
break;
case valor2: Acciones_2;
break;
default: Acciones_Otro_Caso;
}
28. 22/06/2005 28
Sentencias repetitivas: for
Para var desde v1 hasta v2 paso p hacer
Acciones
Fin para
Equivale a:
for(var = v1; var<=v2; var = var + p)
{
acciones;
}
29. 22/06/2005 29
Pedir datos por consola
Para pedir datos por consola hay que
1. crear un flujo de entrada desde el teclado:
InputStreamReader flujo = new InputStreamReader(System.in);
2. crear un canal con buffer:
BufferedReader teclado = new BufferedReader(flujo);
3. realizar la lectura de los caracteres introducidos:
textoLeido = teclado.readLine(); readLine() devuelve String
…
4. para convertir textoLeido en entero:
b = Integer.parseInt(textoLeido); convierte el texto en su valor
entero
30. 22/06/2005 30
Actividad MayorEdad.java
Realizar un programa Java que pida diez edades al
usuario, escribiendo en pantalla
“Mayor de edad” si la edad es >= 18
“Menor de edad” si la edad es < 18
Resolución C:javaMayorEdad.java
31. 22/06/2005 31
Paradigmas de software
Paradigma de software estructurado y modular:
los programas se dividen en procedimientos independientes con
acceso total a los datos comunes
Algoritmos + Estructuras de Datos = Programas
Paradigma de software funcional:
el resultado de un cálculo es la entrada del siguiente, así hasta
que se produce el valor deseado
Paradigma de software orientado a objetos:
los datos se consideran la parte más importante del programa,
de modo que se agrupan en objetos.
Los objetos modelan las características de los problemas del
mundo real, su comportamiento ante estas características y su
forma de interactuar con otros elementos
Objetos + Mensajes = Programas
32. 22/06/2005 32
Diseño orientado a objetos.
Introducción
Para desarrollar software de calidad duradera, hay que
idear una sólida base arquitectónica que sea flexible al
cambio.
El modelado es una parte fundamental en este aspecto,
construimos modelos para poder visualizar el
comportamiento del sistema y poder controlar su
arquitectura.
La importancia de un buen modelado es aún mayor en
sistemas grandes y complejos de software.
33. 22/06/2005 33
Concepto de UML
El Lenguaje Unificado de Modelado (Unified
Modeling Languaje, UML) es el lenguaje estándar
para realizar el modelado de los sistemas de
software y es independiente del lenguaje de
programación utilizado.
Un lenguaje de propósito general para el modelado
orientado a objetos. Cubre: análisis, diseño,
codificación y pruebas
En este curso nos centraremos en la herramientas
más significativas de UML
34. 22/06/2005 34
Elementos de UML
UML tiene tres elementos fundamentales:
Bloques básicos de construcción
Elementos
Relaciones
Diagramas
Reglas que dictan como se pueden combinar estos bloques básicos. UML tiene reglas para:
Nombres
Alcance
Visibilidad
Integridad
Ejecución
Mecanismos comunes. Que se basen en algún patrón de diseño
Especificaciones
Adornos
Divisiones comunes
Mecanismos de extensibilidad
35. 22/06/2005 35
Diagramas UML
Se utilizan para representar las diferentes vistas del producto final.
Los diagramas de UML se pueden dividir en estáticos (aportan una visión
estática del sistema) y dinámicos (aportan una visión dinámica del sistema).
Los diagramas estáticos:
Diagrama de casos de uso
Diagrama de clases
Diagrama de objetos
Diagrama de componentes
Diagrama de despliegue
Los diagramas dinámicos:
Diagrama de estados
Diagrama de actividad
Diagramas de interacción:
Diagrama de secuencia
Diagrama de colaboración
Son muchos diagramas así que aquí nos centraremos sólo en algunos de ellos.
36. 22/06/2005 36
Diagramas de casos de uso
Los diagramas de casos de uso muestran la funcionalidad del sistema desde la perspectiva que tienen los
usuarios y lo que el sistema debe de hacer para satisfacer los requisitos propuestos. Pueden mostrar el
comportamiento de un sistema completo o de una parte.
Los elementos básicos que se utilizan son:
Actores: Son los diferentes usuarios y el papel que representan dentro del sistema
Caso de uso: Representan todo lo que el usuario puede realizar dentro del sistema
Relaciones: Para asociar los elementos anteriores.
Asociación Indica que un actor o caso de uso se comunica con otro
Generalización Relaciona CU más general con CU más específico
Extensión (*) El CU origen es una especialización de un CU más general (hereda)
Inclusión (*) El CU origen incluye un CU más específico
(*) En estas dos se deben de poner también las letras (incluye, o extiende).
Caso de uso
Actor
37. 22/06/2005 37
Ejemplo Tienda.
Casos de uso
Diagrama de casos de uso:
Subcasos de uso: (Nos centramos en el caso Manejo de Ventas)
Dependiente
ManejoVentas
Dependiente
ManejoVentas
ManejoClientes
RealizarVenta
ModificarVenta
AnularVenta
extiende
extiende
extiende
38. 22/06/2005 38
Ejemplo Tienda.
Descripción de Casos de Uso
Tienda
DESCRIPCION DE CASOS DE USO
Nombre: ManejoVentas
Alias:
Actores: Dependiente
Función: Permitir el mantenimiento de las ventas
Descripción: El Dependiente puede registrar nuevas ventas
identificando todas sus características. El sistema debe validar
que el código esté disponible. También es posible modificar
algunas de sus características o anular una venta si esta no se
ha realizado.
Referencias:
De requerimientos:
De Casos: .
39. 22/06/2005 39
Ejemplo Tienda:
Diagrama conceptual
Muestra todos los conceptos asociados al modelo y sus relaciones.
maneja
1 ∞
Dependiente Venta
tiene tiene
∞
1
1
1
Cliente Producto
40. 22/06/2005 40
Diagrama de clase
Dependiente
Son diagramas estáticos ya que no cambian en el tiempo
Diagrama de clase dependiente:
Parte superior: todas sus propiedades informando del ámbito,
nombre y tipo. Sus características.
Parte inferior: todos sus métodos informando del ámbito, nombre y
tipo. Su comportamiento.
Dependiente
dni : String
nombre: String
salario : float
saluda()
41. 22/06/2005 41
Ejemplo Tienda
Diagrama de clases
En un diagrama de clases se muestran todos los
objetos/clases del modelo y sus relaciones
Venta
cliente : Cliente
productos[ ]: Producto
realizarVenta()
modificarVenta()
anularVenta()
maneja
1 ∞
Cliente
codigoCliente : String
nombre: String
dni : String
insertarCliente()
modificarCliente()
eliminarCliente()
Producto
codigoProducto : String
nombre: String
precio : float
insertarProducto
modificarProducto()
eliminarProducto()
insertarProducto
tiene
tiene
1
∞1
∞
Dependiente
dni : String
nombre: String
salario : float
manejarVenta()
saluda()
42. 22/06/2005 42
Programación orientada a
objetos con Java
Antes de seguir decir que UML es muy
extenso y aquí solo se ha pretendido
mostrar algunos de sus diagramas,
centrándonos en los casos de uso y los
objetos.
Pasamos a ver ahora la POO en el
lenguaje Java
43. 22/06/2005 43
Definicion de clase en Java
Sintaxis:
class <NombreClase>
{
// Declaración de atributos
<tipo> <variable> ;…;<tipo><variable>;
// Declaración de métodos
<tipo> <nombreMétodo> ( <tipo><argumento>, … )
{ ... }
}
El nombre del fichero Java debe coincidir con el de la
clase definida en él <NombreClase>.java
Se recomienda definir una clase por cada fichero Java
44. 22/06/2005 44
Ejemplo: clase Dependiente
//Fichero fuente Dependiente.java:
import java.io.*;
public class Dependiente
{
public String nombre, dni; Declaracion de los
atributos de la clase Dependiente
public float salario;
public void saluda() Declaracion del metodo saluda()
{
System.out.println(“Hola, soy el dependiente. ¿En que puedo
ayudarle?”);
}
}
45. 22/06/2005 45
Actividad
SaludaDependiente.java
Crea un fichero java llamado SaludaDependiente1
con dos clases:
Dependiente: cópiala del ejemplo anterior
SaludaDependiente1: Crea un dependiente y haz
que salude.
Resultado: C:javaSaludoDependiente.java
46. 22/06/2005 46
Tipos de clases
Las clases pueden ser declaradas con los siguientes
modificadores: public, abstract, final.
Una clase pública puede ser utilizada desde cualquier parte del
programa.
Una clase abstracta es aquella que contiene métodos
abstractos (no implementados).
Una clase final es aquella que no puede tener subclases.
Por defecto una clase sólo puede ser utilizada por otras clases
del mismo paquete en el que está declarada.
Declaración de clase:
[modificador] class NombreClase [extends NombreSuperClase]
[implements NombreInterface]
47. 22/06/2005 47
Métodos
Los métodos son bloques de código (subprogramas)
definidos dentro de una clase
Un método tiene acceso a todos los atributos de su
clase
Pueden ser llamados o invocados desde cualquier
sitio
Un método puede invocar a otros métodos
Los métodos que se invocan a sí mismos son
recursivos
En Java no se puede definir un método dentro de
otro
La ejecución de todos los programas se inician con el
método main
48. 22/06/2005 48
Ejemplos de Métodos
double tangente ( double x )
{
return Math.sin(x) / Math.cos(x) ;
}
void imprimirHola ( )
{
System.out.println ( “Hola” ) ;
}
String darFormato ( int dia , int mes , int anno )
{
String s ;
s = dia + “/” + mes + “/” + anno ;
return s ;
}
49. 22/06/2005 49
Paso de Argumentos
Java sólo permite pasar argumentos por valor
El método recibe una copia de los argumentos
El valor de los argumentos de tipo primitivo no
cambia fuera del método
El valor de los argumentos de tipo referencia (un
puntero a un objeto) tampoco cambia fuera del
método, pero el contenido del objeto referenciado
sí se puede cambiar dentro del método
El paso de un tipo primitivo equivale al paso por valor
El paso de un argumento de tipo referencia equivale al
paso por referencia
50. 22/06/2005 50
Ámbito de las Variables (I)
En Java se dispone de tres tipos de variables:
Variables miembro pertenecientes a una clase o atributos
Argumentos de un método de la clase
Variables locales de un método de la clase
NOTA: Los argumentos trabajan como variables locales
class Ejemplo
{
int x ; variable miembro
void metodo ( int y ) argumento
{
int z ; variable local
x = y + z ;
}
}
51. 22/06/2005 51
Ámbito de las Variables (II)
Las variables miembro son visibles desde cualquier parte de la clase
Los argumentos y variables locales sólo son visibles dentro del método al que pertenecen.
Dejan de existir al finalizar el método
Dentro de un método, si coincide el identificador de un argumento o variable local con el de
una variable miembro, sólo se accede a la variable del método. Esto se conoce como
ocultacion de variables.
class A {
int x ;
void metodo ( int y ) {
int x = 2 ;
y = 3*x + y - x ;
...println(y); //imprime 8 }
}
... main(...) {
int arg = 4 ;
A obj = new A();
obj.x = 1 ;
obj.metodo(arg);
...println(arg); imprime 4
...println(obj.x); imprime 1
}
52. 22/06/2005 52
Ejemplo: clase Rectangulo
public class Rectangulo{
int base, altura; Atributos
public void imprimirArea() Imprime area
{
System.out.println(“Area: “+base*altura);
}
public int calculaPerimetro() Devuelve perimetro
{
return 2*(base+altura);
}
}
NOTA: En este ejemplo falta un metodo que inicialice los valores
de los atributos base y altura.
53. 22/06/2005 53
Constructores
Son funciones (similares a los métodos) que toman
el mismo nombre de la clase y cuya misión es la de
realizar la inicialización automática de un objeto
cuando se crea. No devuelven ningún tipo, ni
siquiera void.
Cuando en una clase no se especifica un
constructor explícitamente Java crea un constructor
por defecto para esa clase.
Los constructores se pueden definir sin lista de
parámetros o con lista de parámetros con el
propósito de poder inicializar los objetos con valores
concretos.
54. 22/06/2005 54
Añadir un constructor a la
clase Rectangulo
public class Rectangulo{
//1. Este constructor inicializa el objeto con valores fijos
public Rectangulo(){
base = 4;
altura = 2;
}
//2. Este otro constructor inicializa el objeto con valores concretos
public Rectangulo(int b, int a){
base = b;
altura = a;
}
}
…main(){
Rectangulo r1 = new Rectangulo(); Crea un rectangulo con base 4, altura 2
Rectangulo r2 = new Rectangulo(7, 3); Crea un rectangulo con base7,altura3
}
55. 22/06/2005 55
Actividad: Pedir datos por consola
Conversion de texto a enteros
Hacer la mejora al programa anterior de pedir la base y la altura al
usuario para construir un rectángulo de base b, altura h.
Para pedir la base por el teclado:
…
InputStreamReader flujo = new InputStreamReader(System.in);
BufferedReader teclado = new BufferedReader(flujo);
textoLeido = teclado.readLine(); guardamos la base como texto
…
Para convertir textoLeido en entero:
b = Integer.parseInt(textoLeido); convierte el texto en su valor
entero
56. 22/06/2005 56
La referencia this
Hace referencia al objeto o instancia actual.
Se suele usar para evitar la ocultacion de variables.
Ejemplo:
//Este constructor utiliza los mismos nombres de parametros
//que de atributos
public Rectangulo(int base, int altura){
this.base = base;
this.altura = altura;
}
57. 22/06/2005 57
Destructores
En Java no hay destructores de objetos
como en C++
El garbage collector es el encargado de
liberar la memoria:
Cuando detecta objetos no referenciados
Al final de un bloque que haya utilizado
objetos
58. 22/06/2005 58
Sobrecarga de metodos y de
constructores
A veces se necesitan varios métodos o constructores que
hagan la misma tarea pero con argumentos de tipos distintos
En Java es posible definir dos o más métodos dentro de la
misma clase que tengan el mismo nombre, pero con sus listas
de parámetros distintas.
Es una forma de implementar una caracteristica de la POO
que es el polimorfismo
Diferentes metodos Metodo sobrecargado
void mostrarInt(int i) void mostrar(int i)
void mostrarLong(long l) void mostrar(long l)
void mostrarFloat(float f) void mostrar(float f)
Esta característica se llama sobrecarga de métodos
59. 22/06/2005 59
Ejemplo de sobrecarga
Esta clase sobrecarga su constructor, es decir, proporciona dos formas de construir
un objeto.
public class Rectangulo{
int base, altura;
public Rectangulo(){ construye un objeto con base 4, altura 2
base = 4;
altura = 2;
}
public Rectangulo(int b, int a){ construye un objeto con base b, altura a
base = b;
altura = a;
}
}
60. 22/06/2005 60
Naturaleza del miembro de
una clase
static: Cuando se declara un miembro como static,
se puede acceder a él antes de que se haya creado
ningún objeto de esa clase. Las variables de instancia
static son variables globales y los métodos
declarados como static son funciones globales.
La forma de invocar a un método static de una clase
es: nombre_clase.metodo( )
Los métodos estáticos sólo pueden llamar a otros
métodos estáticos y acceder a datos estáticos.
final: se utiliza en Java para definir constantes.
Ejemplo: final float PI=3.14169
61. 22/06/2005 61
Arrays
Los arrays son objetos que almacenan en una variable múltiples
valores del mismo tipo. Los array pueden ser de tipo primitivo o
array de objetos.
Declaracion de un array entero:
int v[];
Construccion de 10 elementos enteros en el array anterior:
v = new int[10]; un array es un objeto y se construye con new
Inicializacion del array:
for(i=0;i<10;i++)
{
v[i] = i;
}
62. 22/06/2005 62
Ejemplo de Array de objetos
Declaracion de un array de objetos tipo Dependiente:
Dependiente vectorDependientes[];
Construccion de n elementos enteros en el array
anterior:
vectorDependiente = new Dependiente[n]; un array es un objeto y
se construye con new
Inicializacion del array:
for(i=0;i<n;i++)
{…
vectorDependiente[i] = new Dependiente(nombre, dni, salario);
}
63. 22/06/2005 63
Otros ejemplos de Arrays
Declaracion, construccion e inicializacion en una linea:
int[] digitos = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
String[] dias = {“lunes”,“martes”,“miércoles”,“jueves”,“viernes”,“sábado”,“domingo”};
Fecha[] festivos = { new Fecha ( 1, 1, 2000), new Fecha ( 15, 5, 2000),
new Fecha ( 12, 10, 2000), new Fecha ( 6, 12, 2000), }
Recorrido de un array:
int[] lista = new int[10];
for (int i = 0; i < lista.length; i++)
{
System.out.println(lista[i]);
}
Arrays bidimensionales:
int[][] trienio = new int[3][12]; Declaracion y construccion en una linea
64. 22/06/2005 64
Actividad: Creacion e inicializacion de un
array de n objetos de tipo Dependiente
Diseñar la clase principal: VectorDependientes.java
que cree y rellene un vector de n objetos de tipo
Dependiente.
A continuacion haz que saluden.
Nota: n y los datos del dependiente se pediran al
usuario.
Resultado: C:javaVectorDependientes.java
66. 22/06/2005 66
Encapsulamiento y Ocultacion
de la Informacion
El encapsulamiento consiste en el agrupamiento de datos y su
tratamiento en una misma estructura como hemos visto
Permite proteger u ocultar algunas partes de los objetos de la
manipulación externa. Esta es la parte privada de la clase
Como norma una clase se comunica con el exterior
proporcionando:
un interface sus metodos publicos
y ocultando sus propiedades impidiendo al exterior conocer
los detalles de implementacion de la clase
67. 22/06/2005 67
Ejemplo de Ocultacion
public class Rectangulo{
private int base, altura; Atributos privados: no pueden ser
accedidos desde el exterior
public Rectangulo(int base, int altura)
{
this.base = base;
this.altura = altura;
}
public int imprimirArea() Metodos publicos: proporcionan el
{ interface con el que el exterior se comunica
return base*altura; con la clase
}
public int calculaPerimetro()
{
return 2*(base+altura);
}
}
68. 22/06/2005 68
Entonces, ¿como accedemos a
las propiedades privadas?
Problema: Al ser las propiedades privadas, es
imposible acceder a ellas desde el exterior
Solucion: proporcionar en la clase dos metodos
publicos de la siguiente forma:
1. damePropiedad() devuelve el valor de la
propiedad
2. ponPropiedad(valor) cambia el valor de
la propiedad pasado por parametro en la
llamada
69. 22/06/2005 69
Ejemplo Rectangulo
public class Rectangulo{
private int base, altura; Atributos privados
…
public int dameBase() Metodo publico que
{ proporciona el valor de la base
return base;
}
public void ponBase(int base) Cambia el valor de la base
{
this.base = base;
}
public int dameAltura() Metodo publico que
{ proporciona el valor de la base
return altura;
}
public void ponAltura(int altura) Cambia el valor de la base
{
this.altura = altura;
}
}
70. 22/06/2005 70
Actividad:
Diseño de la clase Dependiente
Diseña la clase Dependiente siguiendo el siguiente diagrama de
clase, ocultando sus propiedades y proporcionando métodos
públicos de acceso a las mismas. Crea asimismo un
constructor para esta clase.
A continuación crea un programa que cree un objeto de tipo
Dependiente y hacer que el dependiente salude.
Dependiente
dni : String
nombre: String
salario : float
saluda()
71. 22/06/2005 71
Actividad Dependiente.java
La modificación propuesta en la
actividad anterior puedes verla aquí
C:javaDependiente.java
Realiza el cambio a la clase
SaludaDependiente para usar la nueva
clase Dependiente.
72. 22/06/2005 72
Concepto de Herencia
La POO se basa en una jerarquía de clases que consiste
en agrupar atributos y/o métodos comunes
Las clases descendientes se llaman subclases
Las clases ascendientes se llaman superclases
Las subclases heredan características y métodos de
las superclases (excepto los constructores)
Ejemplo:
Vertebrados Mamiferos Caninos
Felinos
Aves
Anfibios
73. 22/06/2005 73
Herencia (ll)
Supongamos, por ejemplo, que tenemos la clase Jefe y la clase
Secretaria definidas como sigue:
class Jefe {
private int codigo. numDepart, numTrabajadores;
private String nombre;
private float salario;
}
class Secretaria {
private int codigo. numDepart;
private String nombre;
private float salario;
private Jefe trabajaPara;
}
Las partes comunes se pueden agrupar en una misma clase,
manteniendo las otras dos clases con las partes no comunes y
heredando de esta nueva clase con la palabra reservada extends
74. 22/06/2005 74
Herencia (lll)
class Empleado
{
private int codigo, numDepart;
private String nombre;
private float salario;
}
class Jefe extends Empleado Jefe hereda de Empleado
{ es subclase de Empleado
private int numTrabajadores;
}
class Secretaria extends Empleado Secretaria hereda de Empleado
{ es subclase de Empleado
private Jefe trabajaPara;
}
Para ver la clase Empleado: C:javaEmpleado.java
NOTA: Para que la relacion de herencia sea correcta, la subclase debe satisfacer la
relacion es-un de la superclase.
Ejemplo: Jefe es-un Empleado, Secretaria es-un Empleado y tiene-un Jefe
75. 22/06/2005 75
Sobreescritura de metodos
Una subclase hereda todos los miembros de su superclase,
y puede modificar los métodos que ha heredado de la superclase,
manteniendo los mismos nombres, tipos de retorno y lista de
argumentos
es la forma de implementar el polimorfismo en la ejecución. P.ej. con el
unico metodo imprimirDatos() imprimimos datos de diferentes objetos:
class Empleado
{
...
public int imprimirDatos(){...} Imprime los datos de Empleado
}
class Jefe extends Empleado
{
private int numTrabajadores;
public int imprimirDatos(){...} sobreescrito para imprimir los datos del Jefe
} se añade la impresión del numero de
trabajadores
76. 22/06/2005 76
Ejemplo de sobreescritura
class Empleado
{
private int codigo, numDepart;
private String nombre;
private float salario;
public int imprimirDatos(){
System.out.println(“Nombre: “ + nombre + ” Departamento: “ + numDepart);
}
}
class Jefe extends Empleado
{
private int numTrabajadores;
public int imprimirDatos(){
super.imprimirDatos (); llamada al metodo heredado
System.out.println(“Numero Trabajadores: “ + numTrabajadores);
}
}
Clase Jefe: C:javaJefe.java
77. 22/06/2005 77
Actividad: Crear n empleados
asignados a un jefe
Diseña y completa la clase Jefe proporcionando un constructor
que pida todos sus datos y ocultando sus atributos.
Diseña y completa la clase Empleado proporcionando un
constructor que pida todos sus datos y ocultando sus
propiedades.
¿Qué deberias hacer para asignar un Jefe a un Empleado?
Diseña la clase CrearOficina que pida al usuario n empleados
y asigna los empleados a un jefe pedido tambien al usuario.
Piensa como harias para contener la lista de empleados en la
propia clase Jefe.
Resultado: C:javaCrearOficina.java
78. 22/06/2005 78
Modificador final
El modificador final tiene tres usos:
El primero es para definir una constante con nombre dentro de una
clase.
final double PI = 3.1416;
El segundo uso es para evitar la sobreescritura de métodos. Cuando
un método se declara como final impide que una subclase derivada
pueda reescribir ese método.
final void metodo(){…}
El tercer uso es para evitar que una clase puede ser heredada, es
decir evitar que la clase pueda ser superclase, como consecuencia
todos sus métodos serán final por defecto.
final class A {…}
79. 22/06/2005 79
Modificador static
Para acceder a las variables y métodos de una clase
es necesario crear primero un objeto
El modificador static puede aplicarse a variables y a
métodos para acceder a ellos sin instanciar ningún
objeto
Los miembros estáticos pertenecen a la clase, no a
los objetos
Atributos estaticos: equivalen a variables globales
Metodos estaticos: solo pueden acceder a miembros
estaticos y no pueden sobreescribirse
80. 22/06/2005 80
Clases abstractas
Una clase abstracta es una clase de la que no se pueden crear objetos, no se
puede instanciar
Un metodo abstracto no se implementa
abstract class Mamifero {
…
public abstract void alimentar();
}
class Canino extends Mamifero {
…
public void alimentar(){…} //exige que sea implementado
}
Todas las subclases de una clase abstracta deben implementar sus métodos
abstractos
81. 22/06/2005 81
Interfaces
Una interface es un conjunto de declaraciones de métodos.
Declaración:
interface <NombreInterfaz> {
<tipo> <var1>; <tipo> <var2>;
<tipo> <nombreMétodo1> ( <args> );
<tipo> <nombreMétodo2> ( <args> );…
}
Una clase que implemente el código de la interfaz debe implementar todos sus métodos
class <NombreClase> implements <NombreInterfaz>
{…
<tipo> <nombreMétodo1> ( <args> ) { <código> }
<tipo> <nombreMétodo2> ( <args> ) { <código> }…
}
Definen la interfaz de programacion de un objeto sin mostrar el cuerpo de la clase
Es la forma de implementar la herencia multiple en Java
82. 22/06/2005 82
Interface Animal
interface Animal{
public void nace();
public String getNombre();
public void setNombre(String nombre);
}
Cualquier clase que implemente un interface deberá implementar
todos sus métodos, de lo contrario la clase se convertirá a
abstracta no pudiéndose crear ningún objeto de ella.
83. 22/06/2005 83
Actividad Perro.java
Crear una clase Perro que implemente
la interfaz anterior.
Propiedades: nombre
Interfaz Animal: javaAnimal.java
Resultado actividad: C:javaPerro.java
84. 22/06/2005 84
Paquetes
Los paquetes en Java son contenedores o agrupaciones de clases
utilizados para evitar conflictos de nombres
dividen el espacio de nombres de forma jerárquica, reflejada en un árbol
de directorios, de tal forma que podamos trabajar con clases que tengan
el mismo nombre en diferentes paquetes
definen un ámbito, ayudando a resolver problemas de control de acceso
Al principio del fichero de la clase se indica a que paquete pertenece
la clase de la siguiente forma, de lo contrario se asignan al paquete
por defecto:
package empresa; donde pertenecerán las clases derivadas
Empleado
package paq1.paq2.paq3; si existe una jerarquía de paquetes
Para ejecutar la clase TestEmpresa del paquete empresa:
java empresa.TestEmpresa
85. 22/06/2005 85
Protección de acceso
La siguiente tabla muestra si se permite el acceso a un miembro de una clase según su
modificador de acceso y su ubicación dentro de la jerarquía de paquetes.
private sin
modificador
protected public
Misma clase Sí Sí Sí Sí
Subclase del mismo
paquete
No Sí Sí Sí
No subclase del mismo
paquete
No Sí Sí Sí
Subclase de diferente
paquete
No No Sí Sí
No subclase de diferente
paquete
No No No Sí
86. 22/06/2005 86
Importar paquetes
Como se vio en la transparencia anterior, en ocasiones no es posible
acceder a las clases que están en otros paquetes por lo que se hace
necesario importarlos. Se pueden importar paquetes enteros o clases
individuales:
import java.io.*; importamos el paquete java.io entero (todas sus
clases)
Import java.io.BufferedReader importamos sólo una clase
El paquete java.lang, que contiene todo lo referente al lenguaje
incluyendo incluso los threads (como característica nativa de Java) se
importa implícitamente.
88. 22/06/2005 88
Excepciones
Java incorpora en el lenguaje el manejo de errores
en tiempo de ejecución (división por cero, índice
fuera de límites, fichero que no existe...)
Estos errores reciben el nombre de excepciones
Java proporciona un mecanismo para capturar y
gestionar las excepciones
Programar manejando excepciones hace que se separen el
código de la tarea a realizar y el código de control de errores
Si no se captura una excepción, el interprete Java termina la
ejecución del programa con un mensaje de error y un
trazado de pila indicando donde se produjo
Ejemplo: abrir y leer de un fichero
89. 22/06/2005 89
Gestion de excepciones
Sintaxis:
try{
// Código que puede provocar excepciones
}catch (<NombreExcepción1> e1 ){
// Código que gestiona la excepción e1
}catch (<NombreExcepción2> e2 ){
// Código que gestiona la excepción e2
}
…
finally{
//se ejecuta justo despues de que termine try, independientemente de si
//se genera o no una excepcion
}
Para gestionar excepciones, se coloca el código que puede causarlas
dentro de la cláusula try y tantas cláusulas catch como posibles
excepciones puedan generarse
90. 22/06/2005 90
Ejemplo de captura de
excepciones
public static void main(String[] args)
{
…
try{
InputStreamReader flujo = new InputStreamReader(System.in);
BufferedReader teclado = new BufferedReader(flujo);
textoLeido = teclado.readLine(); // puede generar excepcion
}catch(IOException e)
{
System.out.println(“Error de lectura por teclado”);
exit(0);
}
…
}
91. 22/06/2005 91
Sentencia throws
No se capturan las excepciones sino que se lanzan ‘hacia arriba’
Sera un metodo superior en la cadena de llamada quien capture
la excepcion
Si ningun metodo captura y gestiona la excepcion es el sistema
quien lo hace dando un error y trazado de pila
public static void main(String[] args) throws IOException
{
…
InputStreamReader flujo = new InputStreamReader(System.in);
BufferedReader teclado = new BufferedReader(flujo);
textoLeido = teclado.readLine(); // puede generar excepcion
…
}
92. 22/06/2005 92
Actividad: capturar las
excepciones de CrearOficina
Usa bloques try…catch para capturar las
excepciones generadas por el metodo
readLine().
Ten en cuenta que las excepciones son
de tipo IOException excepciones de
entrada/salida
Resultado: C:javaCrearOficinaTry.java
93. 22/06/2005 93
Sentencia throw
Permite al programador generar excepciones específicas en
sus aplicaciones.
En la clase Empleado podemos lanzar una excepción de tipo
“Salario no válido” si el salario introducido es < 0
public void ponSalario(float salario) throws Exception
{
if ( salario < 0 ) throw ( new Exception (“Salario no válido”));
this.salario = salario;
}
En este caso si el salario es menor que cero se genera una
excepción con el mensaje “Salario no válido” y no se ejecuta la
asignación a la correspondiente variable miembro.
95. 22/06/2005 95
Excepciones personalizadas
El programador de Java puede crear su propia clase
de excepciones
En el siguiente ejemplo crearemos una clase llamada
ValidarCondicion que lanza una excepción
personalizada de tipo Error si la condición a validar
no es correcta.
La clase principal PedirSalario pide un salario al usuario,
valida con el método estático esCorrecta la condición
“salario > 0”
Si la condición no es correcta lanza una excepción del
tipo Error con el mensaje pasado como parámetro.
97. 22/06/2005 97
Entrada / Salida
Java representa la E/S con un stream (flujo de datos)
Un stream es una conexión entre el programa y la fuente o
destino de los datos
La información se traslada en serie por el stream
Estos conceptos representan cualquier E/S:
lectura/escritura de archivos
comunicación a través de Internet
lectura de la información de un puerto serie
Las clases E/S se encuentran en java.io :
para operaciones con bytes y con caracteres (Unicode-2 bytes)
para entrada (lectura) y para salida (escritura)
98. 22/06/2005 98
Entrada / Salida (ll)
Operaciones con bytes:
para lectura (entrada): clase InputStream
para escritura (salida): clase OutputStream
Operaciones con caracteres (texto):
para lectura (entrada): clase Reader
para escritura (salida): clase Writer
Las cuatro clases son abstractas
Instanciar una subclase de alguna de éstas equivale
a abrir un stream (archivo, recurso de Internet...).
Para cerrarlo, hay que utilizar el método close()
99. 22/06/2005 99
Jerarquia de E/S de bytes
Las clases File., Piped., y ByteArray. indican que hay un dispositivo
con el que se conecta el stream (disco, memoria, URL)
100. 22/06/2005 100
Jerarquia de E/S de caracteres
Reader
BufferedReader
LineNumberReader
CharArrayReader
InputStreamReader
FileReader
FilterReader
PushbackReader
PipedReader
StringReader
Writer
BufferedWriter
CharArrayWriter
OutputStreamWriter
FileWriter
FilterWriter
PipedWriter
StringWriter
PrintWriter
Las clases en negrita indican que hay un dispositivo con el que se
conecta el stream (disco, memoria, etc.)
101. 22/06/2005 101
Nombre de las clases E/S
Se puede deducir la función de una clase según las
palabras que componen su nombre:
InputStream, OutputStream Lectura/Escritura de bytes
Reader, Writer Lectura/Escritura de caracteres
File Ficheros
String, CharArray, Memoria (según el tipo
ByteArray, StringBuffer primitivo indicado)
Piped Tubo de datos
Buffered Buffer
Filter Filtro
Data Intercambio de datos de Java
Object Persistencia de objetos
Print Imprimir
102. 22/06/2005 102
Metodos de
InputStream / Reader
Métodos básicos de lectura:
int read() devuelve un byte / caracter leído o -1 si es fin
de fichero (en el byte de menor peso)
int read(byte[]) lee un conjunto de bytes /caracteres y lo
pone en el array de bytes dado. Devuelve el número de
bytes leídos
int read(byte[],int,int) lee un conjunto de bytes
/caracteres y lo pone en el array de bytes dado empezando
en la posición dada con la longitud dada. Devuelve el
número de bytes leídos
Otros métodos:
void close() cierra el stream abierto
int avaible() devuelve el número de bytes disponibles para
leer
long skip(long) salta el número de bytes/caracteres indicado
103. 22/06/2005 103
Metodos de
OutputStream / Writer
Métodos básicos de escritura:
OutputStream: void write(byte[]) : escribe el array de
bytes/caracteres dado
Writer: void write(char[]) escribe el array de caracteres
dado
Writer: void write(String) escribe una cadena de
caracteres.
Otros métodos:
void close() cierra el stream abierto
void flush() fuerza a que se escriban las operaciones de
escritura que haya pendientes
104. 22/06/2005 104
Lectura y escritura en archivos
Las clases FileInputStream y FileOutputStream
permiten leer y escribir bytes en archivos binarios, o
caracteres de un byte
Las clases FileReader y FileWriter son similares a las
anteriores pero permiten leer y escribir caracteres
Unicode (16 bits) en archivos de texto
Cada llamada a read() o write() accede al disco para
un único byte o un único carácter poco eficiente
Para mejorarlo, se utilizan las clases que
implementan un buffer, de modo que se lee del disco
(o se escribe) un conjunto de bytes o caracteres en
cada acceso
105. 22/06/2005 105
La clase File
La clase File hace referencia a un archivo o un
directorio
Se puede utilizar para obtener información del
archivo o del directorio (tamaño, fecha, atributos...)
Constructores:
File(String nombre)
File(String dir, String nombre)
File(File dir, String nombre)
Ejemplos:
File f1 = new File(“C:windowsnotepad.exe”);
File f2 = new File(“C:windows”, ”notepad.exe”);
File f3 = new File(“C:windows”);
File f4 = new File(f3, “notepad.exe”);
106. 22/06/2005 106
Ejemplo de copia de un
fichero de texto en otro
import java.io.*;
public class Copia {
public static void main(String[] args) throws IOException {
File fichOrigen = new File(“origen.txt");
File fichDestino = new File(“destino.txt");
FileReader entrada = new FileReader(fichOrigen);
FileWriter salida = new FileWriter(fichDestino);
int c;
while ((c = entrada.read()) != -1) salida.write(c);
entrada.close();
salida.close();
}
}
107. 22/06/2005 107
Ejemplos de lecturas y
escrituras en ficheros
Lectura de un fichero de 20 en 20
bytes/caracteres: C:javaFLectura.java
Lectura de un fichero de acceso directo
carácter a carácter:
C:javaFDirecto.java
Manejo de un fichero de acceso directo
: C:javaManejarDirecto.java
108. 22/06/2005 108
Serialización
La serialización es el proceso por el cuál
un objeto o una colección de objetos se
convierten en una secuencia de bytes
que pueden ser almacenados en fichero
y recuperados posteriormente para su
uso.
Se dice entonces que el objeto u
objetos tienen persistencia.
109. 22/06/2005 109
Persistencia.
Interface Serializable
Para utilizar esta capacidad los objetos que
deseamos almacenar tienen que implementar
la interface Serializable.
Se utilizan las subclases ObjectInputStream y
ObjectOutputStream de InputStream y
OutputStream respectivamente
Todas las propiedades del objeto, excepto las
estáticas, serán serializadas
110. 22/06/2005 110
Ejemplo de persistencia.
En el siguiente ejemplo se serializan los
objetos de tipo Alumno, cuya clase
implementa el interface Serializable.
La clase PersistenciaAlumno crea un
flujo de salida FileOutputStream que se
filtra a través de ObjectOutputStream
en el que se almacenarán los objetos
Alumno pedidos al usuario.
112. 22/06/2005 112
Lectura de un archivo de
Internet
Java proporciona un mecanismo que permite leer archivos de
Internet mediante un stream
La clase URL del paquete java.net representa una dirección de
Internet
El siguiente fragmento abre un un stream de lectura con origen
en la dirección dada
URL dir = new URL(“http://www.ulpgc.es/index.html”);
InputStreamReader isr = new InputStreamReader(dir.openStream());
BufferedReader br = new BufferedReader(isr); para filtrar cadenas de
caracteres
String s = br.readLine(); lectura de una cadena de caracteres de la URL
...
113. 22/06/2005 113
Clases útiles
Las clases en Java son muy numerosas, pero existen algunas
clases que pueden resultar interesantes para programar en
Java. Entre otras estas son:
Clase Math
Clases envolventes:
Integer
Float
Double
Boolean
Clase String
Clase StringTokenizer
114. 22/06/2005 114
Clases envolventes de los
datos primitivos
Las clases envolventes (Integer, Float, ...) de los
datos primitivos (int, float, ...) son clases que
permiten conversiones, redondeos y otras
operaciones sobre los tipos de datos primitivos.
Muchos de los métodos son estáticos, es decir, no es
necesario instanciar la clase para invocarlos
A continuación se ven algunos métodos para la clase
Float que son simétricos para las otras clases
115. 22/06/2005 115
Clase Float: algunos métodos
interesantes
Conversiones Clase/Cadena
Float F;
String s = Float.toString( F ); pasa un float a cadena
F = Float.valueOf( "3.14" ); pasa una cadena a float
Conversiones de Clase a tipo de dato
Float F = new Float( Float.PI );
String s = F.toString();
int i = F.intValue(); long l = F.longValue();
float f = F.floatValue(); double d = F.doubleValue();
116. 22/06/2005 116
Clase String
Un objeto de tipo String representa una cadena
constante
Constructores:
String s1 = new String(“hola”);
String s2 = new String();
Otra forma de inicializar un String:
String s3;
s3= “otra vez hola”;
117. 22/06/2005 117
Clase String: más métodos
Métodos básicos:
int length(); int l = s.length(); 4
char charAt( int indice ); char o = s.charAt(2); ‘o’
int indexOf( char carácter ); int ind = s.indexOf (‘o’) 2
Comparacion de String:
boolean equals( Object obj ); s1.equals(s3) false
boolean equalsIgnoreCase( String str2 );
Subcadenas:
String substring (int comienzo, int final);
Mayúsculas / minúsculas:
s.toLowerCase(); s.toUpperCase();
118. 22/06/2005 118
StringBuffer
Un objeto de la clase String una vez inicializado, no
puede ser modificado: ni concatenado ni asignado
nuevamente. Cualquier modificación resultará sobre
otro objeto.
En cambio la clase StringBuffer sí puede sufrir
modificaciones sobre el mismo objeto, como
concatenaciones usando el método append.
Ejemplo:
StringBuffer sb = “hola “;
Sb.append(“que “);
Sb.append(“tal.”);
119. 22/06/2005 119
El paquete java.util
Contiene numerosas clases e interfaces
para la gestión de objetos en listas y
colecciones.
120. 22/06/2005 120
Clase Date
Representa una fecha: el dia, mes, año, horas,
minutos y segundos
Date() crea objetos con fecha y hora actual
Date(año, mes dia) con hora 00:00:00
date(año, mes, dia, horas, minutos, segundos)
Metodos:
getDate() devuelve la fecha actual
toString() devuelve la cadena correspondiente
121. 22/06/2005 121
Clase StringTokenizer
Permite realizar un análisis gramatical (parse) de una
cadena de entrada
Se usa para separar las palabras de una cadena
StringTokenizer token = new StringTokenizer(“Hola ,a todo el, mundo”, ‘ ,‘);
//pasando la cadena y los delimitadores (esp, coma)
while( st.hasMoreTokens() )
{
String palabra = st.nextToken();
System.out.println( palabra + “n” );
}
122. 22/06/2005 122
Clase Math
Es la clase ‘Matemáticas’ y no se instancia
Proporciona métodos matemáticos estáticos:
Math.abs( x ) devuelve el valor absoluto de x
Math.sin ( double x ); Math.cos ( double x ), etc.
Math.sqrt ( double x ) raíz cuadrada
Math.pow ( double x, double y ) potenciación
Math.random () genera double entre 0 y 1 aleatorio
Math.E; Math.PI constantes matemáticas
123. 22/06/2005 123
La clase Vector
La clase Vector (paquete java.util) representa una colección
heterogénea de objetos (referencias a objetos de tipo Object o a
cualquiera de sus subclases) y que puede crecer o decrecer a medida
que lo requiere la aplicación.
Atributos:
int capacityIncrement: incremento en la capacidad del vector. Si vale cero,
duplica el tamaño actual del vector
int elementCount: número de elementos válidos del vector
Object[] elementData: array de objetos donde se guardan los elementos
Constructores:
Vector(): Crea un vector vacío (capacidad 10, incremento 0)
Vector(int initialCapacity): Crea un vector vacío con la capacidad dada
(incremento 0)
Vector(int initialCapacity, int initialIncrement): Crea un vector vacío con la
capacidad y el incremento dados
124. 22/06/2005 124
La clase Vector (ll)
Métodos:
int capacity() devuelve la capacidad que tiene el vector
int size() devuelve el número de elementos en el vector
boolean contains(Object elem) devuelve true si el vector contiene el objeto
especificado
int indexOf(Object elem) devuelve la posición de la primera vez que
aparece el objeto que se le pasa
Object elementAt(int index) devuelve el elemento situado en la posición
indicada (*)
void setElementAt(Object elem,int index) reemplaza el objeto que
corresponde al índice por el objeto que se le pasa (*)
void removeElementAt(int index) borra el objeto situado en la posición
indicada (*)
void addElement(Object elem) añade un objeto al final
void insertElementAt(Object elem,int index) inserta el objeto que se le
pasa en la posición indicada, desplazando el resto de elementos en el
vector (*)
Los métodos con (*) pueden lanzar la excepción ArrayIndexOutOfBoundsException
126. 22/06/2005 126
Programacion concurrente
Threads
Un ordenador con un solo procesador es monotarea
Algunos sistemas operativos simulan multitarea,
dividiendo el tiempo del procesador entre varios
procesos
Un proceso es cada uno de los programas o
aplicaciones que se ejecutan de forma independiente
Tiene asociado:
Tiempo de CPU
Memoria para CÓDIGO
Memoria para DATOS
Un thread (también llamado hilo o hebra de ejecución o
proceso ligero) es un flujo de ejecución simple dentro de un
proceso
127. 22/06/2005 127
Threads (ll)
Un único proceso puede tener varios hilos
(multihilo)
Multitarea vs. multihilo
La JVM es un proceso, desde el punto de vista del
SO, con varios threads ejecutándose a la vez:
Garbage Collector
AWT (Abstract Window Toolkit)
Método main()
Un hilo tiene asociado tiempo de CPU, memoria para
código y memoria para datos, pero se puede comunicar,
coordinar y sincronizar con otros hilos.
128. 22/06/2005 128
Creación de un Thread
implementando Runnable
Hay dos formas de crear un thread
1. Declarar una clase que implemente la interfaz Runnable y crear un
objeto de tipo Thread a partir de ella (mejor forma)
class HiloRunnable implements Runnable{
public void run ( ){
System.out.println(“Hola, soy un hilo”);
}
}
class HolaHilo{
public static void main (String args[]){
HiloRunnable hr = new HiloRunnable ( );
Thread t = new Thread(hr); // Crea el hilo
t.start ( ) ; // Lo ejecuta
}
}
129. 22/06/2005 129
Ejemplo: HolaMultihilo
implementando Runnable
class Hilo implements Runnable{
String nombre ;
Hilo ( String n )
{
nombre = n ;
}
public void run ( )
{
try
{
Thread.currentThread().sleep((int)(Math.random()*3000));
}
catch ( InterruptedException e ) { }
System.out.println("Hola, soy " + nombre ) ;
}
}
class MultiHola{
public static void main (String args[]){
for (int i = 0 ; i < 10 ; i++ ) new Thread ( new Hilo("Hilo "+i) ).start();
}
}
Código: C:javaMultihola.java
130. 22/06/2005 130
Creacion de un Thread
heredando la clase Thread
2. La otra forma de crear un thread es crear una clase que herede de la clase
Thread
class HiloThread extends Thread
{
// Sobreescribe el método run()
public void run ( )
{
System.out.println(“Hola Mundo”);
}
public static void main (String args[])
{
Thread t = new HiloThread(); // Crea el hilo
t.start ( ) ; // Lo ejecuta
}
}
Codigo: C:javaHiloThread.java
131. 22/06/2005 131
Ejemplo: HolaMultihilo
extendiendo Thread
class MultiHolaThread extends Thread{
String nombre ;
MultiHolaThread ( String n )
{
nombre = n ;
}
public void run ( )
{
try
{
sleep( (int)(Math.random()*3000) );
}
catch( InterruptedException e ) { }
System.out.println("Hola, soy " + nombre ) ;
}
public static void main (String args[])
{
for (int i = 0 ; i < 10 ; i++ ) new MultiHolaThread("Hilo "+i).start();
}
}
133. 22/06/2005 133
MVC: Modelo vista controlador
El Modelo es el objeto que representa los datos del programa. Maneja
los datos y controla todas sus transformaciones. El Modelo no tiene
conocimiento específico de los Controladores o de las Vistas, ni siquiera
contiene referencias a ellos. Es el propio sistema el que tiene
encomendada la responsabilidad de mantener enlaces entre el Modelo
y sus Vistas, y notificar a las Vistas cuando cambia el Modelo.
La Vista es el objeto que maneja la presentación visual de los datos
representados por el Modelo. Genera una representación visual del
Modelo y muestra los datos al usuario. Interactúa con el Modelo a
través de una referencia al propio Modelo.
El Controlador es el objeto que proporciona significado a las ordenes
del usuario, actuando sobre los datos representados por el Modelo.
Cuando se realiza algún cambio, entra en acción, bien sea por cambios
en la información del Modelo o por alteraciones de la Vista. Interactúa
con el Modelo a través de una referencia al propio Modelo.
134. 22/06/2005 134
Ejemplo MVC
En esta aplicación de ejemplo se muestra un
controlador que crea los objetos y los pone a
funcionar.
El modelo en este caso es representado por un dato
que es observado por dos clases observadoras.
Las clase observadoras representan las vistas del
modelo, las diferentes formas que tiene el exterior de
interpretar el modelo.
La clase ValorObservable (modelo) implementa el
interface Observable, mientras que las clases
BarraObservador (vista1) y TextoObservador (vista2)
implementan el interface Observer.
136. 22/06/2005 136
Programacion grafica
El interfaz de usuario es la parte del programa que permite a
éste interactuar con el usuario.
El AWT (Abstract Windows Toolkit) es un conjunto de
herramientas que proporciona Java para crear interfaces
graficos (GUI)
Los elementos AWT están implementados usando toolkits
nativos de las plataformas,
Ventaja: conservan una apariencia semejante a todas las
aplicaciones que se creen para esa plataforma.
Desventaja: de que un interfaz gráfico diseñado para una
plataforma, puede no visualizarse correctamente en otra diferente.
137. 22/06/2005 137
JFC y Swing
Para solucionar esta desventaja, entre otras cosas, se creo JFC
(Java Foundation Clases) cuyas caracteristicas son:
Los componentes Swing: desde botones hasta splitpanes
Soporte de aspecto y comportamiento: ofrece a los componentes
una variedad de aspectos y comportamientos
API Java 2D: permite manejar y tratar graficos 2D e imágenes
Los componentes Swing se diferencian de los AWT en que se
añade J al nombre de los mismos
Los componentes Swing soportan mas capacidades que AWT
Java recomienda usar en las aplicaciones graficas
componentes Swing en lugar de AWT (aunque estos ultimos
todavía pueden ser utilizados)
138. 22/06/2005 138
Un programa Swing
Vamos a realizar una pequeña aplicación Swing que realice
conversiones de Euro a pesetas, y que contenga :
Dos cajas de texto: txtEuros, txtPesetas
Un boton de comando: cmdAceptar
Importar los paquetes adecuados:
import javax.swing.*;
import java.awt.*; suele utilizarse AWT para determinadas cosas
Elegir el aspecto y el comportamiento:
Se puede elegir el aspecto deseado: Motif, Java, Windows
O el aspecto multiplataforma (por defecto): Metal, propio de java
Todo programa Swing tiene al menos un contenedor que
contiene componentes Swing (JFrame, JDialog, JApplet…)
139. 22/06/2005 139
Componentes y contenedores
Un interfaz gráfico está construida en base a elementos gráficos
básicos, los Componentes como son los botones, barras de
desplazamiento, etiquetas, listas, cajas de selección o campos de
texto.
Los Componentes permiten al usuario interactuar con la aplicación. En
el AWT, todos los Componentes de la interface de usuario son
instancias de la clase Component o uno de sus subtipos.
Los Componentes no se encuentran aislados, sino agrupados dentro
de Contenedores. Los Contenedores contienen y organizan la
situación de los Componentes; además, los Contenedores son en sí
mismos Componentes y como tales pueden ser situados dentro de
otros Contenedores.
JFrame, JApplet y JDialog son de primer nivelJPanel, y por ejemplo
JPanel es de nivel intermedio (es a su vez componente).
En el AWT, todos los Contenedores son instancias de la clase
Container o uno de sus subtipos.
140. 22/06/2005 140
Un programa Swing (ll)
public class ConversorEuros extends JFrame{ hereda de JFrame
public ConversorEuros() {
//crear los componentes dentro del frame
//añadirlos a un contenedor de nombre content
Container contenido = this.getContentPane();
//Se termina mostrando el frame
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.pack();
this.setVisible(true);
}
} Podria haberse creado una ventana como Frame ventana = new Frame();, de
hecho esto se puede hacer de diferentes formas
Código propuesto: C:javaConversorEuros.java
141. 22/06/2005 141
Conversor: configurar los
botones y las cajas de texto
Se crea una etiqueta y una caja de texto y se añaden al frame
JLabel lblEuros = new JLabel(“Euros: “);
contenido.add(lblEuros);
JTextField txtEuros = new JTextField();
contenido.add(txtEuros);
Se crea un nuevo boton de nombre cmdAceptar y titulo
Convertir
JButton cmdConvertir = new JButton(“Convertir");
cmdConvertir.setMnemonic('i');
cmdAceptar.addActionListener(this);
contenido.add(cmdConvertir);
142. 22/06/2005 142
Manejar evento click en el
boton cmdConvertir
Algunos componentes como los botones pueden generar
eventos, los hay de diferente tipo. Los botones generan eventos
de tipo Action
Para manejar un evento primero es necesario añadir un
‘Escuchador de Eventos’ al objeto que los genera
cmdConvertir.addActionListener(new ManejaBoton());
Una vez detectado un evento por el escuchador se trata ese
evento con un ‘Manejador de Eventos’. En este caso
ManejaBoton es un manejador de eventos Action
143. 22/06/2005 143
Tipos de eventos
ActionListener: El usuario pulsa un botón, presiona Return
mientras teclea en un campo de texto, o elige un ítem de menú.
WindowListener: El usuario elige un frame (ventana principal).
MouseListener: El usuario pulsa un botón del ratón mientras el
cursor está sobre un componente.
MouseMotionListener: El usuario mueve el cursor sobre un
componente.
ComponentListener: El componente se hace visible.
FocusListener: El componente obtiene obtiene el foco del
teclado.
ListSelectionListener: Cambia la tabla o la selección de una
lista.
144. 22/06/2005 144
Manejar Eventos
Crearemos el manejador de eventos GestionaBoton, que implementa
las acciones a realizar cuando se produce un evento. Hay varias
formas de hacer esto (solo veremos esta):
class GestionaBoton implements ActionListener{
public void actionPerformed (ActionEvent e) {
if(e.getActionCommand().equals("Convertir")){
double pesetas;
pesetas = Integer.parseInt(txtEuros.getText())*166.386;
txtPesetas.setText(String.valueOf(pesetas));
}
}
}
Esta clase podria ser interna ya que gestiona solo los eventos de los
botones de esa clase
145. 22/06/2005 145
Actividad: Cambiar la distribucion de
los componentes de ConversorEuros
Cambia el diseño de la ventana de tal
forma que los componentes se
distribuyan formando un grid
Utiliza el metodo setLayout() sobre el
objeto frame
146. 22/06/2005 146
Programacion orientada a
internet
Applets: aplicaciones orientadas al cliente, se
transfieren al cliente y se ejecutan en un
navegador local
Servlets: orientadas al servidor, se ejecutan
en el servidor y los resultados se devuelven
en formato HTML
JSP: misma tecnologia que la anterior pero el
codigo Java esta embebido en el HTML
147. 22/06/2005 147
Applets de Java
Los applets de Java son pequeñas aplicaciones
escritas en lenguaje Java que se ejecutan en el
entorno de un navegador de Internet.
Para que pueda ser ejecutado el applet el navegador
tiene que interpretar una página HTML en la que se
incluya la ejecución de un applet.
Un applet aparece ante los usuarios como una
pequeña aplicación gráfica integrada en el
navegador de Internet.
148. 22/06/2005 148
Estructura básica del applet
El applet sigue un ciclo de vida:
Inicia en el cliente: init(), es el primer
método que ejecuta el applet en el cliente
Funciona: start(), el navegador invoca a
éste método para que inicie la ejecución
Parada: stop(), el navegador ordena al
applet que pare su ejecución
Destuye: destroy(), el navegador ordena al
applet a liberar recursos y memoria
149. 22/06/2005 149
Construir un applet
Para construir un applet hay que
diseñar una clase que extienda Applet o
JApplet e implemente algunos de sus
métodos: init(), start(), stop(),
destroy(), repaint(), etc…
Por último hacer referencia al applet
desde una página web accesible al
cliente desde un servidor web
150. 22/06/2005 150
Ejemplo de applet.
Conversor de euros
Código de la clase:
C:javaAppletConversorEuros.java
Página web: C:javapagina.html