Escolar Documentos
Profissional Documentos
Cultura Documentos
109
7. Bibliografa
Libro general sobre Ingeniera del Software:
Ingeniera del Software. Un enfoque prctico.
5 Edicin. Roger S. Pressman. MacGraw-Hill, 2001.
Para la seccin 2
Construccin de Software Orientado a Objetos.
2 Edicin. Bertrand Meyer. Prentice-Hall, 1999. Captulo 1.
Para la seccin 4
El Lenguaje Unificado de Modelado.
El Proceso Unificado de Desarrollo de Software
Jacobson, Booch, Rumbaugh. Editorial Addison Wesley, 1999
Para la seccin 6
The Capability Maturity Model: Guidelines for Improving the
Software Process. M.C.Paulk, C.V.Weber, B.Curtis y
M.B.Chrissis. Addison-Wesley
Introduccin al Proceso Software Personal (PSP) Watts S.
Humphrey. Addison-Wesley, 2001.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
110
Tema 2:
Construccin de Software
Orientado a Objetos en Java
111
Indice
Introduccin a Java
El lenguaje Java
112
Tema 2.1
Construccin de Software
orientado a objetos en Java
Introduccin a Java
113
Indice
Introduccin a Java
- Qu es Java? Caractersticas
- Tipos de aplicaciones
- Arquitectura de desarrollo
- Anatoma de una Aplicacin
114
Bibliografa
http://www.bruceeckel.com/javabook.ht
ml
EDICIN GRATUITA ELECTRNICA del
libro Thinking in Java
MANUAL en disco CD LSI 2000
Hay mucho material/libros/tutoriales que
se puede encontrar en Internet
LIBROS EN BIBLIOTECA
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
115
116
Qu es exactamente JAVA?
Es un lenguaje de programacin.
Orientado a objetos
Adecuado a la red
Aplicaciones cliente
Aplicaciones servidor
117
Cliente:
Aplicaciones ordinarias.
Applets.
Servidor
Servlets
JSP
EJB
118
Applet
119
Cliente
Aplicacin
120
Html
Servlet
121
JSP
Html <HTML>
%%Java
</HTML>
122
Servidor
Html
Servlet EJB
123
124
Compilacin
(Javac)
Clase1.class
ByteCode Clase2.class
ClaseN.class
125
Seguro
No hay punteros y no se puede acceder a posiciones
arbitrarias de memoria
Hay mecanismos de excepciones. Los navegadores web
comprueban los bytecodes antes de ejecutarlos
Ejecucin eficiente
Ya hay mquinas virtuales Java que ejecutan programas
casi tan rpido como programas C++
126
Multi-hilo
un programa Java puede tener varios hilos (threads)
de ejecucin independientes
El linkado se hace de manera dinmica
al compilar programas java se obtienen clases
escritas en cdigo intermedio bytecodes
el compilador busca clases referenciadas en el
directorio actual y en la variable de entorno
CLASSPATH
Realiza recoleccin de basura automtica
127
Arquitectura de desarrollo
Editores Compiladores
Herramientas
Grasp
de Desarrollo
- JDK JDK
Notepad Cdigo
- Visual Caf Java Bytecode
- Java Workshop Otros
- Jbuilder EditPlus
fichero.java fichero.class
- Jdeveloper
- J++ Otros
- Visual Age javac fichero.java
128
Arquitectura de ejecucin
Java Runtime
Sistema Operativo
Hardware
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
129
Arquitectura de ejecucin
130
Arquitectura de ejecucin
Cargador de clases
Verifica los bytecodes de aplicacin
Carga las clases requeridas por el bytecode
JVM (Java Virtual Machine)
Ejecuta el pseudocdigo bytecode
Dependiente del navegador Web y el S.O.
Permite dos alternativas
Interpretar el cdigo (Java Interpreter)
Compilar de forma dinmica
131
Qu puede fallar ?
132
Editor : JDeveloper
133
134
135
// Aplicacin de ejemplo
// Hola Mundo
//
class HolaMundo{
public static void main(String args[]){
System.out.println(Hola Mundo);
}
} Comentarios (3 tipos)
// Para comentar una lnea
/*Para comentar
una lnea o ms*/
/**Para documentacin usando javadoc*/
136
// Aplicacin de ejemplo
// Hola Mundo
//
class HolaMundo{
public static void main(String args[]){
System.out.println(Hola Mundo);
}
} Declaracin de la clase
El nombre de la clase (que debe ser igual que el
del fichero fuente HolaMundo.java) se utiliza
para crear el fichero class en el mismo directorio
en el que se compila la aplicacin.
137
// Aplicacin de ejemplo
// Hola Mundo
//
class HolaMundo{
public static void main(String args[]){
System.out.println(Hola Mundo);
}
} Mtodo main
Es el mtodo que busca el intrprete para
ejecutar en primer lugar.
Se le pasa como argumento un array de objetos
String llamado args.
138
// Aplicacin de ejemplo
// Hola Mundo
//
class HolaMundo{
public static void main(String args[]){
System.out.println(Hola Mundo);
}
public
}
Indica la accesibilidad del mtodo. Un
mtodo pblico puede ser llamado por
cualquiera, incluyendo el intrprete java
139
// Aplicacin de ejemplo
// Hola Mundo
//
class HolaMundo{
public static void main(String args[]){
System.out.println(Hola Mundo);
}
static
}
Indica al compilador que main es un mtodo
de clase, es decir se refiere a toda la clase y
no a ninguna instancia en particular. Si
alguien instancia esta clase el mtodo main
no se instanciara.
140
// Aplicacin de ejemplo
// Hola Mundo
//
class HolaMundo{
public static void main(String args[]){
System.out.println(Hola Mundo);
}
void
}
Indica que el mtodo main no devuelve
ningn valor.
Es importante indicar el valor de retorno porque
java hace una comprobacin estricta de tipos.
141
// Aplicacin de ejemplo
// Hola Mundo
//
class HolaMundo{
public static void main( String args[]){
System.out.println(Hola Mundo);
}
} String args[]
Es la declaracin de un array de Strings
Son los argumentos que se pasan por la
lnea de comandos.
java HolaMundo arg1 arg2 ...
142
// Aplicacin de ejemplo
// Hola Mundo
//
class HolaMundo{
public static void main(String args[]){
System.out.println(Hola Mundo);
}
} Funcionalidad
Utiliza el mtodo println perteneciente objeto
apuntado por el atributo out de la clase System.
El mtodo println toma como argumento una
cadena (String) y la saca por la salida estndar
(es decir por pantalla).
143
Tema 2.2
Construccin de Software
Orientado a Objetos en Java
144
Objetivos
145
Qu es un objeto ?
146
Qu es un objeto ?
147
Qu es un objeto ?
Mtodos Variables
148
Qu es un objeto ?
Definiciones
149
Qu es un objeto ?
Definiciones
Encapsulacin: describe la vinculacin de un
comportamiento y un estado a un objeto en particular.
Ocultacin de informacin: Permite definir qu partes
del objeto son visibles (el interfaz pblico) que partes
son ocultas (privadas)
jas
enta El objeto puede cambiar y su interfaz pblico ser compatible
V
con el original esto facilita la reutilizacin de cdigo
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
150
Qu es un objeto ?
Encapsulacin de objetos
MIEMBROS DE UNA CLASE
Los objetos encapsulan variables permitiendo
acceso a ellas nicamente a travs de los mtodos
Variables: Contenedores de valores
Mtodos: Contenedores de funciones
Un objeto tiene:
Estado : representado por el contenido de sus variables o atributos
Comportamiento definido por sus mtodos
Normalmente:
Los mtodos son pblicos
Las variables son privadas
Puede haber mtodos privados
Es peligroso tener variables pblicas
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
151
Qu es un objeto ?
Clasificacin de objetos
152
153
154
Paso de Mensajes
Interfaz pblico
Implementacin
Arrancar
155
Paso de mensajes
Ejemplo
Clientes
Empresa Almacn
SolicitarPedido(Cliente, Artculo)
Facturacin
156
Ejemplo sencillo
157
Tema 2.3
Construccin de Software
orientado a objetos en Java
El Lenguaje Java
158
Objetivos:
Como representamos en Java las clases y los objetos
Identificadores
Java Palabras reservadas
Tipos bsicos en Java
159
Identificadores
160
Palabras reservadas
161
162
Tipos primitivos
163
Tipos primitivos
El tipo booleano: los operadores relacionales
164
Tipos primitivos
El tipo booleano: los operadores lgicos
&& (Y lgico)
|| (O lgico)
! (NO lgico)
Los operadores && y || cortocircuitan, es
decir, evalan de izquierda a derecha y
en cuanto encuentran un valor false (en
el caso &&) o true (en el caso ||) dejan de
evaluar el resto.
boolean esmultiplo = a!=0 && b%a==0;
Al cortocircuitar evita el error cuando a es 0
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
165
Tipos primitivos
Precedencia de operadores
166
Tipos primitivos
El tipo de datos char
167
Tipos de referencia
Ejemplo:
public class Persona{
Coche suCoche;
Persona suCompaero;
} suCoche
168
Objetivos:
Como representamos en Java las clases y los objetos
Identificadores
Java Palabras reservadas
Tipos bsicos en Java
169
170
Declaracin de atributos
171
Declaracin de atributos
Quin puede acceder al atributo?
Permisos de accesibilidad
public Accesible para todas las clases
private Accesible slo en los mtodos de la propia clase
(friendly) Accesible slo desde clases que estn en el mismo paquete
protected
172
Declaracin de atributos
Varia su valor durante la ejecucin ?
173
Declaracin de atributos
A quin pertenece el atributo?
174
Declaracin de atributos
A quin pertenece el atributo?
Coche{
nRuedas=4;
nCoches=3;
}
175
Declaracin de atributos
Los modificadores
Modificadores de acceso
nRuedas nCoches marca
Clase/Obj static static instancia
Constante final variable variable
Ambito private private private
Tipo int int String
176
Declaracin de mtodos
177
Declaracin de mtodos
parmetros Resultado
Mtodo
(param1, param2)
178
Declaracin de mtodos
parmetros Resultado
Mtodo
(param1, param2)
179
Declaracin de mtodos
180
Declaracin de mtodos
Mtodos con argumentos: parmetros por valor
181
Declaracin de mtodos
Mtodos con argumentos: parmetros por valor
Coche@125
tuCoche Coche@125 BI-1123-AE Matricula
140 Velocidad
Coche@129
miCoche Coche@129 6776 BCZ Matricula
80 Velocidad
ponmeATuVelocidad(Coche@125)
setVelocidad(80)
182
Declaracin de mtodos
Mtodos con argumentos: parmetros por valor
Coche@125
tuCoche Coche@125 BI-1123-AE Matricula
80 Velocidad
183
Declaracin de mtodos
Sobrecarga de mtodos
class Punto2D {
double x;
double y;
void print() {
System.out.println(Coords: + this.x + , + this.y);}
void print(int n) {
for (int i = 0; i < n; i++) {
System.out.println("(" + this.x + "," + this.y + ")");
}}}
Los mtodos print() y print(n) de la clase Punto2D son distintos
Estn sobrecargados (overloaded)
Si mipunto es un objeto de la clase Punto2D
mipunto.print(5); escribira 5 veces las coordenadas del punto
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
184
Declaracin de mtodos
Que sucede si se devuelven varios argumentos ?
185
Mtodos constructores
186
Mtodos constructores
Creacin de un objeto (instancia)
class Circunferencia {
float radio;
Circunferencia(float r) { // This is the constructor
radio=r;
}
}
Creacin de un objeto de la clase Circunferencia
Circunferencia c;
c = new Circunferencia(4.5);
187
class unaClase {
public static void main(String args[ ])
Es el mtodo que busca el interprete para ejecutar en primer
lugar.
Los parmetros del main (String args[ ]) representan un
array de Strings que guarda los argumentos que escribimos
en la lnea de comandos al ejecutar el programa.
java HolaMundo arg1 arg2 ...
Normalmente se crea una clase artificial para ubicar el mtodo
main
public indica que se puede invocar de cualquier lugar
static indica que este mtodo se refiere a toda la clase, es
decir no hay un mtodo main por cada objeto.
void indica que no devuelve ningn tipo de datos
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
188
Acceso a los atributos de la
clase desde los metodos
class Libro {
static String editor=UZEI ;
int hojas; }
189
190
Resumen
Programa
Clases
Miembros
Atributos Mtodos
191
192
193
Y su representacin en UML
SE LLAMA
COMPONENTE
Coche EN UML
- matricula: String
- velocidad: double
- velMaxima: double Coche.java
CLASE DE DISEO
Es una REALIZACIN en UML.
EN ESTE CASO SIGNIFICA QUE EL COMPONENTE Coche.java
IMPLEMENTA LA CLASE DE DISEO Coche
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
194
195
Persona
- nombre: String
- fechaNac: Date
+ getNombre(): String
+ getFechaNac(): Date
+ getEdad(): int
.....
Se accede de una manera uniforme a los valores de los objetos de la
clase: getVALOR()
nombre => implementado a travs de almacenamiento
fechaNac => implementado a travs de almacenamiento
edad => implementado con un clculo
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
196
Objetivos:
Cmo representamos en Java las clases y los objetos
Identificadores
Java Palabras reservadas
Tipos bsicos en Java
197
Objetivos II:
Cmo utilizamos las clases existentes y desarrollamos nuevas
Utilizacin
Libreras Creacin
Ejemplos de uso
Vector, Stream, Integer
if / if ... else
Sentencias
Java for
while / do ... while
Excepciones
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
198
199
Para usar una clase de un paquete hay que aadir una sentencia
import antes:
import java.net.URL;
public class Ejemplo {
// Se usa URL simplemente en vez de java.net.URL
// URL u = new URL(args[i]);
Para importar todas las clases de un paquete: import java.awt.*;
La sentencia anterior no importa las clases de los subpaquetes, por
ejemplo, java.awt.event
No hay que importar el paquete java.lang
System.out.println() es en realidad una llamada al mtodo
println() del objeto almacenado en el atributo esttico out de
la clase java.lang.System (ese objeto es la salida estndar)
200
201
202
Entrada/Salida: java.io
Wrapping: java.lang
203
Arrays (Matrices)
Qu son?
204
Arrays (Matrices)
Declaracin, Creacin, Inicializacin
205
Arrays (Matrices)
Declaracin, Creacin, Inicializacin
Mediante un bucle
For(int i = 0; i < nombreArray.length; i++){
nombreArray[i] = elemento-i;
}
206
207
208
209
Arrays Multidimensionales
A[0][2]=C A[0][2][1]=l
char a[][]; //Declara char a[][][]; //Declara
a = new char[3][3] //Crea a = new char[3][3][3] //Crea
a[0][0]=A; //Inicializa a[0][0][0]=g; //Inicializa
... ...
210
Vectores
Qu son?
211
Vectores
Qu son? Mtodos constructores
212
Vectores
Mtodos de acceso
Mtodos acceso Significado
Object firstElement( ) Devuelve el primer elemento
Object lastElement( ) Devuelve el ltimo elemento
Object ElementAt(int index) Devuelve el elemento que hay en posicin index
Enumeration elements() Devuelve una enumeracin con los elementos
213
Vectores
Mtodos de insercin, eliminacin, modif
214
Vectores
Tamao y replicacin de vectores
Mtodos tamao Significado
int capacity() Devuelve el n de elementos que puede almacenar (capacidad)
int size() Devuelve el n de objetos realmente almacenados en el vector
void setSize(intnewSize) Establece un nuevo tamao (puede aadir o eliminar refs)
void trimToSize() Ajusta el tamao del vector a los elementos que realmente tiene
boolean isEmpty () Comprueba si el vector est o no vaco
1 2 3
v.size() = 3
Vector v v.capacity() = 4
215
Arrays vs Vectores
ARRAY VECTOR
216
Streams
Lectura/Escritura
217
Streams
Escritura en archivos
218
Streams
Escritura en archivos
Pasos para la escritura en un archivo:
1. Clase que modele un fichero fsico: File
2. Clase que modele el flujo de salida
fileOutputStream => fichero
bufferedOutputStream => teclado o red
3. Clase que implemente las operaciones sobre el flujo de salida
PrintStream
219
Streams
Lectura de archivos
220
Streams
Lectura de teclado
Pasos para la lectura en un archivo:
1. Clase que modele el flujo de entrada (datos sin interpretar)
fileInputStream => fichero
bufferedInputStream => teclado o red
2. Clase que modele el flujo de entrada como un flujo de caracteres
InputStreamReader(no reconoce final de linea o separacin entre cadenas) teclado
3. Clase que ofrezca las operaciones de lectura (readline)
BufferedReader
System.in
isr
InputStream
teclado
InputStreamReader
(creado)
BufferedReader (creado)
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
221
Streams
Lectura de teclado/fichero
FICHERO TECLADO
InputStreamReader isr;
BufferedReader entrada;
Isr=new InputStreamReader (is);
Entrada=new BufferedReader (isr);
Entrada.readLine ();
222
Streams
Lectura de una URL
mensaje
openStream()
URL
ins return
internet
isr
FilterInputStream
teclado
InputStreamReader
(creado)
ordenador
BufferedReader (creado)
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU remoto
223
Streams
Lectura de una URL
224
Streams
Lectura de un fichero binario de una vez
225
Streams
Lectura de un fichero de una vez
226
Streams
Algunos comentarios
En Java es bastante lioso trabajar con ficheros,
entrada/salida estndar porque hay que escoger
cul es el Stream apropiado
En el anexo se puede apreciar que existen muchas
clases distintas
Es necesario buscar en la documentacin del JDK
Por el contrario, Java permite hacer virgueras:
Leer una URL situada en Internet como si fuera un
fichero local.
Leer un fichero y cargarlo en memoria principal con
una nica operacin de lectura !!!
Tambin es posible salvar en un fichero el contenido
de un objeto y de todos los objetos que referencia !!!
Lo veremos al hablar de persistencia de objetos
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
227
Streams
Ejemplo: leer del teclado y guardar
import java.io.*;
/**
* Lee texto de la entrada estndar y lo escribe en
* el fichero NombreFich.txt
**/
public class LeerTec {
public static void main(String argv[])
{ int carint; char car;
InputStreamReader fichent = new InputStreamReader(System.in);
try{
PrintWriter salida = new PrintWriter(
new FileWriter("NombreFich.txt"));;
while ((carint=fichent.read())!=-1)
{ car = (char)carint;
salida.print(car);}
salida.close();
} catch(Exception e){System.out.println("Error."} }}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
228
Streams
Ejemplo: leer de una URL y guardar
import java.io.*;
import java.net*;
/**
* Lee una URL y la escribe en el fichero NombreFich.html
**/
public class LeerURL {
public static void main(String argv[])
{ int carint; char car;
try{ URL url = new URL("http://www.ehu.es");
InputStream ent = url.openStream();
InputStreamReader fichent = new InputStreamReader(ent );
PrintWriter salida = new PrintWriter(
new FileWriter("NombreFich.html"));
while ((carint=fichent.read())!=-1)
{ car = (char)carint; salida.print(car); }
salida.close();
} catch(Exception e){System.out.println("Error: "+e.toString());}}}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
229
Streams
Ejemplo: leer de URL y guardar
import java.io.*;
import java.net.*;
/**
* Leer una URL con una sola lectura (con un MAXIMO de bytes)
**/ SE PUEDE PROBAR
public class LeerURL1lectura { CON UN FICHERO .gif
public final static int MAXIMO = 10000;
public static void main(String argv[])
{ try{URL url = new URL("http://www.ehu.es/");
InputStream ent = url.openStream();
OutputStream salida = new FileOutputStream("NombreFich.html");
byte[] tablaBytes = new byte[MAXIMO];
int cuantosLeidos = ent.read(tablaBytes);
salida.write(tablaBytes);
salida.close();
} catch(Exception e){System.out.println("Error: "+e.toString());}}}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
230
Streams
Realizar clase LectorEscritorTexto
LectorEscritorTexto
- input: InputStream
- output: OutputStream
- vect: Vector
+ LectorEscritorTexto()
+ setLectorURL(String URL): void
+ setLectorFichero(String fich): void
+ setEscritorFichero(String fich): void
+ leer(): void
+ escribir(): void
231
Streams
Realizar clase LectorEscritorTexto
new LectorEscritorTexto()
obj: LectorEscritorTexto teclado: InputStream pant: OutputStream
obj
leer() Repetir leer carcter
hasta fin de entrada y
hasta EOF read() guardar en un vector
Escribir vector, elemento a
escribir()
elemento, en la salida
hasta fin vector write(elemVector)
setLectorFichero(nomFichE)
new(nomFichE)
fichEnt: InputStream
leer()
read()
setEscritorFichero(nomFichS)
new(nomFichS)
escribir() fichSal: OutputStream
write(elemVector)
233
Principio de Auto-Documentacin
234
Principio de Auto-Documentacin
La herramienta Javadoc genera de manera automtica documentacin a
partir de los programas fuente Java. Para ello, estos programas deben
tener comentarios y etiquetas entendidas por Javadoc /** */
Etiqueta Quin lo utiliza Objetivo
@author name Clases e interfaces Autor del cdigo. Se pone una etiqueta
para cada autor.
@deprecated Clases, mtodos Mtodo anticuado. Mejor no utilizarlo.
235
Wrappers
236
Wrappers
Ejemplo clase Integer
237
Wrappers
Ejemplo clase Integer
public class miVector {
private Vector theVector;
public miVector() {
theVector=new Vector();
}
public void add (int i) {
theVector.add(new Integer(i));
}
public float getMedia() {
Enumeration e=theVector.elements();
float media=0;
int elem,nElems;
while (e.hasMoreElements()) {
elem=(Integer)e.nextElement(); nElems++
media=media+elem.intValue ();
}
return media/nElems; }}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
238
Wrappers
Mtodos de la clase Integer
239
Objetivos II:
Cmo utilizamos las clases existentes y desarrollamos nuevas
Utilizacin
Libreras Creacin
Ejemplos de uso
Vector, Stream, Wrappers
240
Sentencias Java
if, if-else
condicionales if(Expresin-booleana)
if(Expresin-booleana) acciones
acciones else
acciones
COMO EN C
class Hello {
public static void main (String args[]) {
if (args.length > 0) {
System.out.println("Hello " + args[0]); }
else {
System.out.println("Hola, quien quiera que seas.");
}}}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
241
Sentencias Java
Sentencias: ?
max = (a>b) ? a : b;
equivalente a
242
Sentencias Java
switch
COMO EN C
class NumDiasMes {
public static void main (String args[]) {
if (args.length!=2)
System.out.println("Error: Se llama NumDiasMes mes anio");
else { int mes=Integer.valueOf(args[0]).intValue();
int anio=Integer.valueOf(args[1]).intValue();
switch (mes) {
case 1: case 3: case 5: case 7: case 8:
case 10: case 12: System.out.println(31); break;
case 4: case 6: case 9: case 11: System.out.println(30); break;
case 2: if (anio%400==0 || anio%4==0 && anio%100!=0)
System.out.println(29);
else System.out.println(28);
break;
default: System.out.println("Error: mes incorrecto");
}}}}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
243
Sentencias Java
Bucles
Bucles
while(Expresin-booleana)
acciones
do
acciones
while(Expresin-booleana);
244
Sentencias Java
while
class Hello {
public static void main (String args[]) {
System.out.print("Hola ");
int i = 0;
while (i < args.length) { COMO EN C
System.out.print(args[i]);
System.out.print(" ");
i = i + 1;
}
System.out.println();
}}
245
Sentencias Java
for
class Hello {
public static void main (String args[]) {
System.out.print("Hola ");
for (int i = 0; i < args.length; i = i + 1) {
System.out.print(args[i]);
System.out.print(" ");
}
System.out.println();
}
}
COMO EN C
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
246
Sentencias Java
do ... while
class Hello {
public static void main (String args[]) {
int i = -1;
do {
if (i == -1) System.out.print("Hola ");
else {
System.out.print(args[i]);
System.out.print(" ");
}
i = i + 1; COMO EN C
} while (i < args.length);
System.out.println();
}
}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
247
Excepciones
Qu son
Para qu sirven
Qu tipos hay
Como utilizarlas
248
Excepciones
Qu son?
249
Excepciones
Para qu sirven?
250
Excepciones
Qu tipos hay?
251
Excepciones
Ejemplos frecuentes
RuntimeException
ArithmeticException
NumberFormatException
IndexOutOfBoundException
NullPointerException
Java.io.*
EOFException
FileNotFoundException
IOException
252
Excepciones
Ejemplos frecuentes
Cmo se produce
Implcitamente (cuando se produce un error)
Explicitamente throw new IOException(mensaje)
Qu hacer
Tratarla
Rodear con try{} las sentencias susceptibles de lanzar
excepciones
Rodear con catch (nombreException){} las sentencias que se
deben ejecutar cuando se produce
Lanzarla public void miMetodo throws IOException
Rodear con finally{} el cdigo que queremos que se ejecute
siempre
253
254
255
256
257
Tema 2.4
Construccin de Software
Orientado a Objetos en Java
258
ndice
Herencia
Redefinicin de mtodos
Significado de la herencia
Principio Abierto-Cerrado
Clase/Mtodo/Atributo final
Polimorfismo y Ligadura Dinmica
Utilidad del Polimorfismo y Ligadura Dinmica
Principio de Eleccin nica
259
ndice
Herencia mltiple
Clases abstractas e interfaces
Para qu sirven los interfaces?
La superclase java.lang.Object
mtodos clone() y equals()
Genericidad
260
Tenemos implementadas
Herencia las clases Polgono y Punto
Polgono Punto
listaOrdenadaPuntos: Vector x, y: float
-- constructoras + visualiz... -- constructoras + visualiz...
numLados(): int distancia(otroPunto): float
perimetro(): float
dibujar(): void
@Pt1 3.0 4.0
(6,2) OBJETOS:
(3,4) @Pt2 4.0 6.0
@Pt3 5.0 7.0
(7,5)
(4,6) @Pt4 7.0 5.0
(5,7) @Pt5 6.0 2.0
@Pg1 <@Pt1,@Pt5,@Pt4,@Pt3,@Pt2>
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
261
Herencia
262
Herencia
263
Herencia
@Pt1 3.0 4.0
(6,2)
(3,4) @Pt2 4.0 6.0
@Pt3 5.0 7.0
(7,5)
(4,6) @Pt4 7.0 5.0
(5,7) @Pt5 6.0 2.0
@Pg1 <@Pt1,@Pt5,@Pt4,@Pt3,@Pt2>
Punto pt1 = new Punto(3,4); pg1.addPunto(pt1);
Punto pt2 = new Punto(4,6); pg1.addPunto(pt2);
Punto pt3 = new Punto(5,7); pg1.addPunto(pt3);
Punto pt4 = new Punto(7,5); pg1.addPunto(pt4);
Punto pt5 = new Punto(6,2); pg1.addPunto(pt5);
Poligono pg1 = new Poligono();
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
264
Herencia
Polgono Y queremos trabajar con
listaOrdenadaPuntos: Vector una clase Rectngulo...
-- constructoras + visualiz...
numLados(): int
permetro(): float
dibujar(): void Si se realiza de esta manera,
no hay que volver a
implementar los mtodos de
Rectngulo Polgono.
La clase Rectngulo los
centro: Punto
hereda de Polgono.
lado1, lado2: float
265
Herencia
(1,1) (5,1)
(3,2.5)
(1,4) (5,4)
Adems de sus propios atributos,
tiene los atributos de la clase
Polgono @Pt6 1.0 1.0 @Pt9 1.0 4.0
@Pt7 5.0 1.0
@Pt8 5.0 4.0 @Pt10 3.0 2.5
@Rt1 <@Pt6,@Pt7,@Pt8,@Pt9>
@Pt10 4.0 3.0
266
Herencia
public class Rectangulo extends Poligono {
private Punto centro;
private double lado1, lado2;
private double xIzq, xDer, yArr, yAba;
public Rectangulo(Punto c, double l1, double l2) {
// super(); Automticamente llama a constructor vaco heredado
centro=c; lado1=l1; lado2=l2;
// Aadir puntos para que funcione perimetro()
xIzq = c.getX()- l1/2; xDer = c.getX()+l1/2;
yArr = c.getY()- l2/2; yAba = c.getY()+l2/2;
addPunto(new Punto(xIzq,yArr));
addPunto(new Punto(xIzq,yAba));
addPunto(new Punto(xDer,yAba));
addPunto(new Punto(xDer,yArr)); }
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
267
Herencia
268
Herencia
269
Redefinicin de mtodos
270
Redefinicin de mtodos
Polgono
listaOrdenadaPuntos: Vector
-- constructoras + visualiz...
numLados(): int
perimetro(): float
dibujar(): void
Rectngulo
Queremos redefinir
centro: Punto el mtodo heredado
lado1, lado2: float de Poligono
diagonal1(): Lnea perimetro () ya que
diagonal2(): Lnea es ineficiente
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
271
Redefinicin de mtodos
super.perimetro();
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
272
Otro ejemplo
public class Coche { // Definida anteriormente
private String matricula;
private double velocidad;
private double velMaxima;
public Coche(String m, double v, double vm){..}
....................
public void acelerar(double deltaV)
{ this.velocidad = this.velocidad + deltaV;
if (this.velocidad > this.velMaxima)
{ this.velocidad = this.velMaxima; }
if (this.velocidad < 0.0)
{ this.velocidad = 0.0; } } }
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
273
Otro ejemplo
274
Otro ejemplo
SOLUCIN: crear una nueva clase CocheLento que herede de
Coche y donde se redefinan los mtodos necesarios.
public class CocheLento extends Coche {
private double limVeloc = 100;
public CocheLento(String matricula, double velocidad,
double velMaxima) {
super( matricula,
(velocidad < limVeloc) ? velocidad : limVeloc,
velMaxima); }
Es correcto?
public void acelerar(double deltaV) {
super.acelerar(deltaV);
if (velocidad > limVeloc) {velocidad = limVeloc;} }
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
275
Otro ejemplo
if (velocidad > limVeloc) {velocidad = limVeloc;}
Slo es correcto si velocidad es
public o
protected o
tiene visibilidad de paquete (friendly) y las clases
Coche y CocheLento estn en el mismo paquete
276
Significado de la herencia
El punto de vista modular
Mdulo: conjunto de servicios ofrecidos al
exterior
Un descendiente describe una extensin del
mdulo padre y puede por tanto usar los
servicios que le proporcione.
EJEMPLO: la clase CocheLento usa la clase Coche para
extenderla/redefinirla/cambiarla.
La herencia sirve para reutilizar cdigo (lo que se
hereda) y extenderlo (lo redefinido y/o aadido)
REUTILIZACIN Y EXTENSIBILIDAD
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
277
Significado de la herencia
278
Significado de la herencia
La paradoja de la
extensin-especializacin
es una extensin, desde el
punto de vista de los mdulos
es una especializacin, desde
el punto de vista de los tipos
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
279
Principio Abierto-Cerrado
280
Principio Abierto-Cerrado
X EST CERRADA Clase A
X EST
ABIERTA
Estas clases NO QUIEREN que X cambie
Clase Y
En otro contexto se necesita usar una clase
parecida a X:
usar algn mtodo de X
usar algn mtodo de X, adaptndolo
SOLUCIN: crear Y
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU con algn mtodo nuevo
281
Clase/Mtodo/Atributo final
282
Polimorfismo
POLIMORFISMO es la capacidad
para adaptar varias formas.
CONEXIN POLIMORFA:
Ej. 1) Si tenemos
Poligono p = new Poligono();
Rectangulo r = new Rectangulo();
y se realiza la siguiente asignacin:
p = r;
p apunta a un rectngulo, no a cualquier polgono
283
Polimorfismo
Ejemplo 2
284
Polimorfismo
Qu sucede exactamente durante una
conexin polimorfa?
Tras ejecutar
p = r;
285
Polimorfismo
Tipo esttico, tipo dinmico
El tipo esttico es el tipo usado para declarar una
entidad.
Si en ejecucin, la referencia se conecta a un objeto
de un cierto tipo, este tipo se convierte en el tipo
dinmico.
Poligono p = new Poligono();
TIPO ESTTICO DE p es Polgono
TIPO DINMICO DE p es Polgono
Rectangulo r = new Rectangulo();
p = r;
TIPO ESTTICO DE p es Polgono
TIPO DINMICO DE p es Rectngulo
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
286
Polimorfismo
Rectangulo Rombo
Poligono p;
Rectangulo r;
r=p; ES CORRECTO ?
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
287
Polimorfismo
Casting
Claro, es responsabilidad del programador el
que el tipo dinmico de p sea Rectangulo...
288
Polimorfismo
Poligono p;
Linea l;
....
if (p instanceof Rectangulo)
r = (Rectangulo)p;
289
Ligadura dinmica
290
Polimorfismo/Ligadura Dinmica
Utilidad
Polgono
listaOrdenadaPuntos: Vector PanelGrafico
-- constructoras + visualiz... usa leerPoligono(): Poligono
numLados(): int aadirPoligono(p:Poligono);
perimetro(): float ......
dibujar(): void
Rectngulo TringuloRectngulo
centro: Punto centro: Punto
lado1, lado2: float cateto1, cateto2, hipotenusa: float
diagonal1(): Lnea
base(): float
diagonal2(): Lnea
altura(): float
perimetro(): float // REDEFINIDA
perimetro(): float // REDEFINIDA
Supongamos que tenemos estas clases ya
implementadas y el cdigo de la
transparencia siguiente
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
291
Polimorfismo/Ligadura Dinmica
Utilidad
292
Polimorfismo/Ligadura Dinmica
Utilidad
TringuloIssceles
centro: Punto Aadir una nueva
ladosIgual, ladoDist: float
base(): float
subclase de Polgono
altura(): float
perimetro(): float // REDEFINIDA
Qu habra que cambiar?
Modificar el mtodo
leerPoligono () para que ofrezca
PanelGrafico tambin la posibilidad de leer
leerPoligono(): Poligono tringulos issceles de la
aadirPoligono(p:Poligono); entrada. Este sera el nico
...... mtodo que conocera todos los
tipos de polgonos posibles.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
293
Polimorfismo/Ligadura Dinmica
Utilidad
294
Polimorfismo/Ligadura Dinmica
Utilidad
// SE LEEN VARIOS POLGONOS, SE AADEN A UN PANEL Y SE CALCULA
// EL PERMETRO TOTAL COMO LA SUMA DE TODOS LOS PERMETROS
PanelGrafico panel = new PanelGrafico();
float perimetroTotal = 0.0;
while (...) {
Poligono p = panel.leerPoligono(); // Lee un POLGONO de ENTRADA
panel.aadirPoligono(p); // Aade el polgono ledo al panel grfico
if (p instanceof Rectangulo)
perimetroTotal += p.perimetro_del_rectangulo();
else if (p instanceof TrianguloRectangulo)
perimetroTotal += p.perimetro_del_triangulo_rectangulo();
}
Si se hubiera escrito as, entonces, al aadir tringulos issceles, habra que cambiar este cdigo.
Esta forma de codificarlo implica que hay que conocer todas las opciones de polgonos aqu.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
295
296
Herencia mltiple
Una clase como especializacin de varias
En UML es AvinCompaa
vlido...
public class AvionCompania ... pero en Java
extends Avion, Activo {} no se permite.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
297
Herencia mltiple
A B
atribX atribX
metodY metodY
AyB
298
299
abstract
300
Interfaz
301
Implementacin de interfaces
302
Interfaz
303
304
Para qu sirven las interfaces?(I)
1. Suplir la carencia de herencia mltiple en Java.
Avin
numPasajeros: int
altitud: float Activo
posicin: float precioCompra: float
velocidad: float
valorVenta: float
despega(): void depreciacin: float
aterriza(): void
cambiaVeloc(v: float): void pagoMensualidad(): void
} implements Activo {
private float precioCompra, valorVenta, depreciacion;
305
306
307
308
309
310
311
Clase Exposicin
312
313
Clase Exposicin
314
315
A Interface Nuevo
Interface sin mtodos
B
X, Y,... son las X Y
clases nuevas
C
316
317
La superclase: java.lang.Object
318
Mtodos de java.lang.Object
El mtodo toString() por defecto escribe el
nombre de la clase correspondiente al objeto.
Mejor devolver valor como string
El mtodo equals() (al igual que el operador
==) devuelve si los objetos son idnticos. Si se
desea comparar con valores => redefinir
A continuacin se presenta la redefinicin del mtodo equals () para
coches. Se dice que 2 coches son iguales si tienen la misma matrcula.
319
Mtodos de java.lang.Object
320
Mtodos de java.lang.Object
321
Genericidad
322
Genericidad
323
Genericidad en Java
324
Genericidad en Java
public class Pila {
...
public int cuantos() {...}
public void meter(elem: Object) {...}
public Object sacar() {...}
....}
Sin embargo, una clase definida as, permite que
cualquier objeto se introduzca en la pila. No se
necesita definir PilaEntero, PilaReal, etc. Adems
la pila puede tener objetos de distintas clases.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
325
Genericidad en Java
326
Tema 3:
Arquitecturas Software de varios
niveles en Java