Você está na página 1de 109

53

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
54

111

Indice

Introduccin a Java

Programacin basada en objetos

El lenguaje Java

Programacin orientada a objetos

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

112

Tema 2.1

Construccin de Software
orientado a objetos en Java

Introduccin a Java

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
55

113

Indice

Introduccin a Java
- Qu es Java? Caractersticas
- Tipos de aplicaciones
- Arquitectura de desarrollo
- Anatoma de una Aplicacin

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
56

115

Historia del lenguaje

El lenguaje Java fue creado por Sun


Microsystems Inc.
Aparece en el ao 1995 y debe, en
gran medida, su popularidad al xito
del servicio WWW.
Los navegadores incorporan un
entorno de ejecucin de programas
JAVA (applets).

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

116

Qu es exactamente JAVA?

Es un lenguaje de programacin.
Orientado a objetos
Adecuado a la red
Aplicaciones cliente
Aplicaciones servidor

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
57

117

Tipos de aplicaciones JAVA


5 tipos bsicos

Cliente:
Aplicaciones ordinarias.
Applets.

Servidor
Servlets
JSP
EJB

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

118

Tipos de aplicaciones JAVA


Clientes: Applets

Son aplicaciones Java que se ejecutan bajo el contexto de


un navegador
Se ejecuta en un contexto seguro, es decir, NO puede
acceder a los recursos (memoria, disco...etc) de la mquina
donde se est ejecutando
Cliente
Navegador

Applet

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
58

119

Tipos de aplicaciones JAVA


Clientes: Aplicaciones convencionales

Son aplicaciones Java que se ejecutan como una aplicacin


local sin limitaciones.

Cliente

Aplicacin

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

120

Tipos de aplicaciones JAVA


Servidor: Servlets

Aplicaciones Java, que devuelven como resultado HTML.


Normalmente se utilizan para la generacin de pginas
dinmicas o control
Servidor

Html

Servlet

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
59

121

Tipos de aplicaciones JAVA


Servidor: JSP

Pginas HTML con cdigo Java embebido.


Normalmente el cdigo Java suele ser el encargado de
acceder a alguna fuente de datos y rellenar parte de la
pgina
En la primera invocacin a un JSP el sistema lo transforma
en un Servlet Servidor

JSP
Html <HTML>

%%Java

</HTML>

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

122

Tipos de aplicaciones JAVA


Servidor: EJB

Piezas de software reutilizables implementados en Java


Independiente de plataforma (J2EE)
Tratamiento de seguridad, transacciones, sesiones declarativo

Servidor

Html
Servlet EJB

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
60

123

Caractersticas del lenguaje

Sintaxis general y estructuras de control


parecidas al C.
Orientado a objetos:
herencia
polimorfismo (late binding)
encapsulamiento (abstraccin datos)
Todo son clases: no hay estructuras de
datos separadas ni variables globales.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

124

Caractersticas del lenguaje


Multiplataforma

Programa fuente F.java

Compilacin
(Javac)
Clase1.class
ByteCode Clase2.class
ClaseN.class

JVM para la JVM para la JVM para la


mquina 1 mquina 2 mquina 3

Cdigo mquina Cdigo mquina Cdigo mquina


1 2 3

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
61

125

Caractersticas del lenguaje

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++

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

126

Caractersticas del lenguaje

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
62

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

128

Arquitectura de ejecucin

Aplicaciones en formato Bytecode


Java Class Libraries
(Java extension Apis)
Cargador de clases
Verificador de Bytecode Java Class Libraries
(Java Base Apis)

Java Interpreter JIT (Just in Time Compiler)

Java Runtime

Sistema Operativo

Hardware
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
63

129

Arquitectura de ejecucin

Librera de clases de java


Java Base API
Java.lang: Interfaz y ncleo de clases
Java.util: Clases de utilidades
Java.io: Clases de input/output
Java.net: Clases de red (Basada en TCP/IP)
Java.applet: Clase Applet
Java Standard Extension API
JMF
J2D, J3D, etc.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
64

131

Qu puede fallar ?

Compilar Syntax Error


Cargar Class not found Exception

Verificar Security Exception


Ejecutar Null Pointer Exception

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

132

Por donde empezar

Editor : JDeveloper

Entorno de desarrollo: JDK (JDeveloper)


Variables de entorno
CLASSPATH: La lista de directorios que contienen los
ficheros.class que queremos ejecutar. Debera contener al
menos $JAVA_HOME/lib/classes.zip
PATH: Lista de bsqueda de los ejecutables debera
contener al menos $JAVA_HOME/bin

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
65

133

Como configurar las variables de entorno

set PATH=c:\jdk1.2\ bin;C:\WINDOWS\COMMAND\


set CLASSPATH=c:\jdk1.2\lib\classes.zip;.

Conservando el valor de las variables antiguas:


set PATH=c:\jdk1.2\ bin;C:\WINDOWS\COMMAND\; %PATH%
set CLASSPATH=c:\jdk1.2\lib\classes.zip; %CLASSPATH%;.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

134

Una aplicacin bsica en Java


HolaMundo.java
// Aplicacin de ejemplo
HolaMundo.class
// Hola Mundo
//
class HolaMundo{
public static void main(String args[]){
System.out.println(Hola Mundo);
}
}

1. Compilamos: javac HolaMundo.java


2. Ejecutamos: java HolaMundo

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
66

135

Anatoma de una aplicacin

// 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*/

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

136

Anatoma de una aplicacin

// 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.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
67

137

Anatoma de una aplicacin

// 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.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

138

Anatoma de una aplicacin

// 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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
68

139

Anatoma de una aplicacin

// 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.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

140

Anatoma de una aplicacin

// 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.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
69

141

Anatoma de una aplicacin

// 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 ...

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

142

Anatoma de una aplicacin

// 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).

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
70

143

Tema 2.2

Construccin de Software
Orientado a Objetos en Java

Programacin basada en objetos


Clases y objetos

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

144

Objetivos

Definir los conceptos bsicos de la programacin


basada en objetos.
- clases, objetos
- miembros (variables, mtodos)
- abstraccin y ocultacin de la informacin
Describir relacin entre clases y objetos
Crear un objeto sencillo y modelar
- sus atributos (por medio de variables)
- su comportamiento (por medio de mtodos)
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
71

145

Qu es un objeto ?

Los objetos son representaciones (simples/complejas)


(reales/imaginarias) de cosas: reloj, avin, empleado, etc.
No todo puede ser considerado como un objeto, algunas
cosas son simplemente caractersticas o atributos de los
objetos: color, velocidad, etc.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

146

Qu es un objeto ?

Abstraccin funcional Abstraccin de datos


-Hay cosas que sabemos - Un coche adems tiene
que los coches hacen pero ciertos atributos:
no como lo hacen: color
avanzar velocidad
parar marca
girar izda etc..
girar drcha - La forma en la que se
definen los atributos no tiene
importancia en el diseo

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
72

147

Qu es un objeto ?

Abstraccin funcional Abstraccin de datos

Mtodos Variables

Miembros pblicos Miembros privados

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

148

Qu es un objeto ?
Definiciones

Miembros pblicos Miembros privados


Los miembros pblicos Describen la implementacin
(describen qu pueden de cmo se hace:
hacer los objetos de - Ejemplo: el mtodo girar llave del
objeto contacto interacciona con el
esa clase) circuito elctrico del vehculo, este con
- Comportamiento del el motor, etc.
objeto. - En sistemas orientados a objetos
puros todo el estado es privado y
solo se puede cambiar a travs de
la interfaz pblica
- Ej: el mtodo pblico frenar puede
cambiar el valor del atributo privado
velocidad

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
73

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)

La llave de contacto es un interfaz pblico del


mecanismo de arranque de un coche
La implementacin de cmo arranca realmente
es privada y sobre ella slo puede actuar la llave
de contacto

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
74

151

Qu es un objeto ?
Clasificacin de objetos

Clase: Conjunto de objetos con estados


y comportamientos similares
Podemos referirnos a la clasecoche (cualquier
instancia de la clasificacin coche)
Mi coche que es un objeto, es decir una instancia
particular de la clase coche
La clasificacin es arbitraria, depende del problema
a resolver

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

152

Objetos vs. Clases

Una clase es una entidad abstracta


- Es un tipo de clasificacin de datos
- Define el comportamiento y atributos de un grupo de
de estructura y comportamientos similar
Clase Coche Nombre de la clase
Mtodos: arrancar, avanzar, parar, ... Mtodos (funciones)
Atributos: color , velocidad, etc. Atributos (datos)

Un objeto es una instancia o variable de una clase


- Un objeto se distingue de otros miembros de la clase
por sus atributos. Nombre: Ferrari
Objeto Ferrari Mtodos: arrancar, avanzar, parar,...
Perteneciente a la Atributos: color=rojo;
clase Coche velocidad=300Km/h

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
75

153

Interacciones entre objetos

El modelado de objetos modela:


los objetos y
sus interelaciones
Para realizar su tarea el objeto puede delegar
trabajos en otro que puede ser parte de l
mismo o de cualquier otro objeto del sistema.
Los objetos interaccionan entre s
envindose mensajes

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

154

Paso de Mensajes
Interfaz pblico

Implementacin
Arrancar

Un objeto enva un mensaje a otro


- Esto lo hace mediante una llamada a sus atributos o mtodos
Los mensajes son tratados por la interfaz pblica del objeto
que los recibe
- Eso quiere decir que slo podemos hacer llamadas a aquellos atributos
o mtodos de otro objeto que sean pblicos o accesibles desde el objeto
que hace la llamada
El objeto receptor reaccionar
- Cambiando su estado (es decir modificando sus atributos)
- Enviando otros mensajes (es decir llamando a otros atributos o mtodos
del mismo objeto (pblicos o privados) o de otros objetos
(pblicos o accesibles desde ese objeto))
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
76

155

Paso de mensajes
Ejemplo

Clientes

Empresa Almacn
SolicitarPedido(Cliente, Artculo)
Facturacin

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

156

Ejemplo sencillo

Crear una clase Empleado que tenga:


dos atributos
el nombre
el apellido
dos comportamientos
printNombre()
printApellido()
Implementar los mtodos
Como podra saber el nmero de Empleados?

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
77

157

Tema 2.3

Construccin de Software
orientado a objetos en Java

El Lenguaje Java

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

158

Objetivos:
Como representamos en Java las clases y los objetos

Declaracin de una clase


Declaracin de una variable
OO
Declaracin de un mtodo
Creacin de un objeto

Identificadores
Java Palabras reservadas
Tipos bsicos en Java

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
78

159

Identificadores

Sirven para nombrar variables, mtodos, clases, objetos y


todo lo que el programador necesite identificar.
Comienzan con una letra, un subrayado o un smbolo $
Distinguen maysculas y minsculas y no tienen longitud
mxima
Por convenio:
Los nombres de variables, mtodos y objetos comienzan
por minscula.
Los nombres de las clases comienzan por mayscula
Si contienen varias palabras, se unen evitando subrayado
y separando las palabras con maysculas deEsteModo

Los identificadores no pueden ser palabras reservadas


A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

160

Palabras reservadas

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
79

161

Tipos bsicos en Java

Todas las variables/atributos de java son


de un tipo de datos.
El tipo de la variable/atributo determina:
Los valores que puede tomar
Las operaciones que se pueden realizar
Vamos a estudiar
Tipos primitivos
Tipos de referencia

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

162

Tipos primitivos

IMPORTANTE: Tamao Predefinido e


independiente de Plataforma java.lang

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
80

163

Tipos primitivos
El tipo booleano: los operadores relacionales

El tipo booleano (boolean) y la constantes


(true y false) existen en Java (en C no)
Los operadores relacionales son: <, >, <=,
>=, == y != (como en C)
Los operadores <, >, <= y >= slo pueden
ser usados con nmeros y caracteres (no
con strings, booleanos, arrays, etc.). Los
operadores == y != s pueden usarse con
estos ltimos
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
81

165

Tipos primitivos
Precedencia de operadores

+ La precedencia es (de mayor a menor)


!
* / %
+ -
< > <= >=
== !=
&
Los operadores en la misma
|
lnea tienen IGUAL prioridad.
&& En ese caso se ejecutan de
|| izquierda a derecha
?:
- = (asignacin)
Ej: 8/2*5 es ((8/2)*5) = 20

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

166

Tipos primitivos
El tipo de datos char

Los literales de tipo carcter se escriben


entre comillas simples
char micar = g;
Caracteres especiales
\n fin de lnea \b backspace
\t tabulador \ dobles comillas
\ comilla simple \\ backslash

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
82

167

Tipos de referencia

Su valor es una referencia (puntero) al valor


representado por la variable.

Ejemplo:
public class Persona{
Coche suCoche;
Persona suCompaero;
} suCoche

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

168

Objetivos:
Como representamos en Java las clases y los objetos

Declaracin de una clase


Declaracin de un atributo
OO
Declaracin de un mtodo
Creacin de un objeto

Identificadores
Java Palabras reservadas
Tipos bsicos en Java

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
83

169

Declaracin de una clase

public class Coche{


//Declaracin de atributos
// (color, velocidad, etc)
//Declaracin de mtodos
// (arrancar, parar, etc.)
}
Sintaxis Estilo
(modificadores) class NombreClase{ Nombre fichero = nombre clase
1 letra mayscula
//cdigo de la clase
Sin espacios en blanco ni guiones
} Las palabras se separan con
maysculas MiPrimeraClase
Indentacin

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

170

Declaracin de atributos

public class Coche{


//Declaracin de atributos
private String color;
private int velocidad;
//Declaracin de mtodos
// (arrancar, parar, etc.) Valores por defecto de tipos bsicos.
}
Sintaxis Estilo
Nombres intuitivos
(mods) tipo nombre; 1 letra minscula
(mods) tipo nombre1, nombre2; Sin espacios en blanco ni guiones
Las palabras se separan con
(mods) tipo nombre = valor; maysculas: miVariable
Indentacin
Inicializacin de la
variable a un valor
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
84

171

Declaracin de atributos
Quin puede acceder al atributo?

private String color;


private int velocidad;

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

172

Declaracin de atributos
Varia su valor durante la ejecucin ?

Constantes (atributos que no se pueden modificar):


usar la palabra clave final
inicializarlo obligatoriamente en la declaracin

public class Coche{


private final int nRuedas=4;
public String color;
}

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
85

173

Declaracin de atributos
A quin pertenece el atributo?

A cada una de las instancias (una por instancia)


Ejemplo:
marca, matriculo, kms, color, aoMatriculacin
A la clase (static). Un solo miembro por clase,
independientemente del nmero de instancias (objetos) de
la clase que hayamos creado y aunque no exista ninguna
Ejemplo:nCoches, nRuedas
public class Coche{
private static final int nRuedas=4;
private static int nCoches;
private String color;
private String marca;
private int kms;
}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

174

Declaracin de atributos
A quin pertenece el atributo?

Coche{
nRuedas=4;
nCoches=3;
}

Coche1 Coche2 Coche3


color=rojo; color=azul; color=blanco;
marca=Ferrari; marca=Opel; marca=Seat;
kms=10000 kms=20000 kms=15000

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
86

175

Declaracin de atributos
Los modificadores

public class Coche{


int nRuedas;
int nCoches;
int marca;
}

Modificadores de acceso
nRuedas nCoches marca
Clase/Obj static static instancia
Constante final variable variable
Ambito private private private
Tipo int int String

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

176

Declaracin de mtodos

public class Coche{


//Declaracin de atributos
private String color;
private int velocidad;
//Declaracin de mtodos
public void arrancar(){
//cdigo para el mtodo arrancar
}
public void avanzar(int velocidad){
Estilo
//cdigo para el mtodo avanzar Nombres intuitivos
} 1 letra minscula
public String queColor(){ Sin espacios en blanco ni
//cdigo para averiguar el color guiones
return color; Las palabras se separan con
} maysculas miMetodo()
Indentacin
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
87

177

Declaracin de mtodos

public class Coche{


//...
public void avanzar (int velocidad) {
//codigo para el mtodo avanzar
}
//...
} Coche.java

parmetros Resultado
Mtodo
(param1, param2)

(modificadores) tipoRetorno NombreMetodo(tipo1 param1, tipo2 param2){


//cdigo del mtodo
return expresion; //cuando el tipoRetorno es void no es necesario
}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

178

Declaracin de mtodos

public class Coche{


//...
public String queColor(){
//codigo para averiguar el color
return color;
}
//...
} Coche.java

parmetros Resultado
Mtodo
(param1, param2)

(modificadores) tipoRetorno NombreMetodo(tipo1 param1, tipo2 param2){


//cdigo del mtodo
return expresion; //cuando el tipoRetorno es void no es necesario
}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
88

179

Declaracin de mtodos

Son bloques de cdigo que describen el


comportamiento de los objetos
Los mtodos
tienen 0, 1 o ms argumentos (parmetros)
definen el tipo de resultado en su declaracin.
(Salvo los constructores)
pueden tener variables locales. Estas variables
no se inicializan por defecto.
Si el mtodo devuelve un resultado la ltima
sentencia debe ser un return
Mtodos especiales
El constructor y el mtodo main
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

180

Declaracin de mtodos
Mtodos con argumentos: parmetros por valor

public class Coche {


String matricula;
double velocidad;
double getVelocidad() { return velocidad; }
void setVelocidad(double v) { velocidad = v; }
void ponmeATuVelocidad(Coche c)
{c.setVelocidad(velocidad); } }

SUPONGAMOS QUE TENEMOS: Coche miCoche , tuCoche ;


LLAMADA: miCoche . ponmeATuVelocidad(tuCoche );

tuCoche ES UN PARMETRO POR VALOR. El valor que contiene NO


PUEDE CAMBIAR DENTRO DEL MTODO LLAMADO (esto es,
tuCoche no puede apuntar a otro objeto).

PERO LOS VALORES DEL OBJETO APUNTADO POR tuCoche S !


A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
89

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

SE EJECUTA: miCoche. ponmeATuVelocidad(tuCoche);


Coche@129: Coche Coche@125: Coche

ponmeATuVelocidad(Coche@125)

setVelocidad(80)

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

182

Declaracin de mtodos
Mtodos con argumentos: parmetros por valor

Coche@125
tuCoche Coche@125 BI-1123-AE Matricula

80 Velocidad

NO SE PUEDE CAMBIAR EL CONTENIDO DE tuCoche ,


PERO S LOS VALORES DEL OBJETO CUYA REFERENCIA
SE HA PASADO POR VALOR.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
90

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 ?

Dado un vector devolver la media as como el nmero de elementos


class Utilities {
public ????????? Media (Vector v) {
...............
}}
Solucin: Se crea una clase artificial con tantos atributos
como argumentos haya que devolver
class Resultado {
float media;
int nElems;
}
NOTA: Aunque es factible este enfoque, lo adecuado es que cada
mtodo devuelva un solo valor
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
91

185

Mtodos constructores

Cuando se crea un objeto sus miembros se


inicializan con un mtodo constructor
Los constructores:
llevan el mismo nombre que la clase
No tienen tipo de resultado
Conviene que haya al menos 1 constructor
Si no existen se crea un constructor por defecto
que inicializa las variables a su valor por defecto.
Si la clase tiene algn constructor el constructor
por defecto deja de existir.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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);

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
92

187

El mtodo principal (main)

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; }

Modificacion atributo static Modificacion atributo del objeto


class Libro { class Libro {
static void modificarEditor1( String ed ) { void incrHojas3( int h ) {
1 editor =ed; } 3 hojas=hojas+h; }
void modificarEditor2(String ed ) { static void incrHojas4( Libro l, int h) {
2 Libro. editor =ed;} 4 l.hojas=h;}

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
93

189

Acceso a los elementos de la clase

Donde/Ambito static instancia


Mtodo de static 1 nombreAtributo 4 nomObjeto. nombreAtributo
la clase
instancia 2 nomClase nombreAtrib 3 nombreAtributo
kanpotik 5nomClase. nomMetodo 6 nomObjeto. nomMetodo
main(String args[]) {
Libro l1=new Libro(Informatika hiztegia);
5 Libro.modificarEditor1(Elhuyar);
6 l1. modificarEditor2(Elhuyar);
6 l1.incrHojas(100);
5 Libro.incrHohas(l1,100);

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

190

Resumen

Programa

Clases

Miembros

Atributos Mtodos

Tipo de Tipo Mtodos Mtodos


Referencia Bsico Normales Especiales

?????? Objetos Constructor Main


A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
94

191

Ejemplo de clase Java

// CLASE Coche DEFINIDA EN EL FICHERO Coche.java


public class Coche {
private String matricula;
private double velocidad; // LOS CAMPOS SON PRIVADOS
private double velMaxima;
// Mtodo CONSTRUCTOR que asegura (velMaxima >= 0)
public Coche(String matricula, double velMaxima)
{ this.matricula= matricula;
this.velocidad = 0.0;
if (velMaxima >= 0.0) { this.velMaxima = velMaxima; }
else { velMaxima = 0.0; } }
// (contina)
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

192

Ejemplo de clase Java


// Mtodos ACCESORES de lectura (getter)
public String getMatricula() { return this.matricula; }
public double getVelMaxima() { return this.velMaxima; }
public double getVelocidad() { return this.velocidad; }

// Mtodos ACCESORES de escritura (aseguran una velocidad vlida) (setter)


public void setMatricula(String matricula) { this.matricula = matricula; }
public void acelerarMaximo() { this.velocidad = this.velMaxima; }
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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
95

193

Y su representacin en UML
SE LLAMA
COMPONENTE
Coche EN UML
- matricula: String
- velocidad: double
- velMaxima: double Coche.java

+ Coche(matricula: String, velMaxima: double)


+ getMatricula(): String
+ double getVelMaxima(): double
+ getVelocidad(): double
+ setMatricula(matricula: String): void
+ acelerarMaximo(): void CLASE DE
+ acelerar(deltaV: double): void IMPLEMENTACIN

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

Principio de Acceso Uniforme

Meyer ha identificado cinco principios para la


construccin de software OO
Unidades modulares lingsticas
Auto-Documentacin
Acceso Uniforme
Abierto-Cerrado
Eleccin nica
Principio de Acceso Uniforme: Todos los servicios
ofrecidos por un mdulo deben estar disponibles a
travs de una notacin uniforme, sin importar si estn
implementados a travs de almacenamiento o de un
clculo.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
96

195

Principio de Acceso Uniforme

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

Declaracin de una clase


Declaracin de una variable
OO
Declaracin de un mtodo
Creacin de un objeto

Identificadores
Java Palabras reservadas
Tipos bsicos en Java

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
97

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

La librera de clases Java

Java contiene una extensa librera de clases ya escritas que


pueden usarse en los programas. Estas clases se organizan
en paquetes.
El objetivo de este curso no es explicar todos los
paquetes. Se pretende que cada uno intente buscar
primero en la documentacin del JDK si ya existen
paquetes con clases que implementan lo que se desea
Cada paquete define clases, interfaces, excepciones y errores.
Ejemplos:
java.applet java.awt java.lang
Cada paquete puede dividirse en subpaquetes
(que en realidad se tratan como paquetes distintos)
java.lang.reflect es subpaquete de java.lang

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
98

199

La librera de clases Java


Importar clases/paquetes

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)

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

200

Construir paquetes propios

Slo puede haber una clase pblica por fichero


El fichero debe llamarse igual que la clase pblica que contenga
con extensin .java
La primera sentencia de cada fichero indicar el paquete en el
que se aade la clase
package nombre_paquete;
Para usar esas clases desde otros habr que aadir la
sentencia correspondiente:
import nombre_paquete.*;

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
99

201

Construir paquetes propios


Dada la clase (en el fichero MiClase.java)
package proy_uno.redes;
public class MiClase {
.}
Se compila para obtener la clase MiClase.class
MiClase.class debe dejarse en el subdirectorio
proy_uno/redes que cuelgue de uno de los directorios del
CLASSPATH
CLASSPATH es una variable de entorno del sistema que
contiene todos los directorios donde el compilador de java
(javac) va a buscar las clases Java importadas (ficheros
.java, .class, .zip, .jar)
Si no se hiciera as, el compilador no encontara
MiClase.class al encontrarse lo siguiente: import
proy_uno.redes.MiClase;
% javac -d /home/misclasses MiClase.java
Deja la clase MiClase.class en el directorio /home/misclases/proy_uno/redes (lo crea si no existe)
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

202

Algunos paquetes interesantes

Estructuras de datos lineales: java.util.Vector

Entrada/Salida: java.io

Wrapping: java.lang

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
100

203
Arrays (Matrices)
Qu son?

Coleccin de entidades del mismo tipo


almacenadas en una unidad
El operador indexacin [ ] permite el
acceso a cada elemento del array
El atributo length nos permite saber el
n de elementos que contiene el array

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

204

Arrays (Matrices)
Declaracin, Creacin, Inicializacin

Declaracin : Consiste en asignar un identificador


al array y decir de qu tipo sn los elementos que
va a almacenar. tipo nombreArray[] ;
Se puede hacer de 2 formas tipo []nombreArray;
Despus de la declaracin an no se ha asignado
memoria para almacenar el array no podemos acceder a
su contenido Valores por defecto:
int, short, long = 0
Creacin : Consiste en reservar float, double = 0.0
boleanos = false
espacio en memoria para el array String = null
Es necesario utilizar new y especificar Object = null

tamao del array nombreArray = new tipo[numPosiciones];


Una vez creado el array sus elementos tienen los
valores por defecto hasta que el array sea inicializado

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
101

205

Arrays (Matrices)
Declaracin, Creacin, Inicializacin

Inicializacin : Consiste en dar valores a los


distintos elementos del array podemos hacerlo de
varias formas:
Elemento a elemento
nombreArray [0] = elemento0;
nombreArray [1] = elemento1;
...

Mediante un bucle
For(int i = 0; i < nombreArray.length; i++){
nombreArray[i] = elemento-i;
}

Por asignacin directa


nombreArray = {elem1, elem2, elem3, ...};

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

206

Ejemplos: Arrays (Matrices)


Declaracin, Creacin, Inicializacin

Arrays de tipos bsicos


int a[]; //Declara int a[] = new int[3] //Declara y Crea int a[] = new int[3] //Declara y crea
a = new int[3] //Crea a[0]=1; //Inicializacin for(int i=0; i<a.length;i++){ //inicializa
a[0]=1; //Inicializa a[1]=2; a[i]=i+1;
a[1]=2; a[2]=3; }
a[2]=3;

int a[] = {1, 2, 3}; //Declaracin, creacin Inicializacin

Arrays de objetos (Tipos de referencia)


MiClase a[]; //Declara MiClase a[] = new MiClase[3] MiClase a[] = new MiClase[3]
a = new MiClase[3] //Crea //inicializa //inicializa
a[0]=new MiClase(param1); a[0]=new MiClase(param1); for(int i=0; i<a.length;i++){
a[1]=new MiClase(param2); a[1]=new MiClase(param2); a[i]=new MiClase(param-i);
a[2]=new MiClase(param3); a[2]=new MiClase(param3); }

int MiClase[] = {new MiClase(param1), new MiClase(param2), new MiClase(param3)};


A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
102

207

Arrays (Matrices): Errores frecuentes


Declaracin, creacin, inicializacin

public class EjemplosMatrices{


public static void main(String args[]){ compilar
double miMatriz[];
Sintaxis
System.out.println(miMatriz[0]); MAL
Falla la
compilacin
}
}

variable miMatriz may not have been initialized

Cuando la matriz slo ha sido declarada no podemos acceder a sus


elementos. El programa no compilara y dara un error

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

208

Arrays (Matrices) Errores frecuentes


Declaracin, creacin, inicializacin
public class EjemplosMatrices2{
public static void main(String args[]){
int miMatrizDeEnteros[] = new int[10]; compilar
float miMatrizDeReales[]= new float[10];
boolean miMatrizDeBooleanos[] = new boolean[10];
char miMatrizDeCaracteres[] = new char[10]; Ejecutar
String miMatrizDeStrings[] = new String[10];
Object miMatrizDeObjetos[] = new Object[10];
System.out.println("Entero por defecto: " + miMatrizDeEnteros[0]);
System.out.println("Real por defecto: " + miMatrizDeReales[0]);
System.out.println("Booleano por defecto: " + miMatrizDeBooleanos[0]);
System.out.println(Carcter por defecto: " + miMatrizDeCaracteres[0]);
System.out.println("String por defecto: " + miMatrizDeStrings[0]);
System.out.println("Objeto por defecto: " + miMatrizDeObjetos[0]);
Entero por defecto: 0
}
} Real por defecto: 0.0
Booleano por defecto: false
Cuando la matriz slo ha sido declarada y creada pero Carcter por defecto:
no inicializada podemos acceder a sus elementos pero String por defecto: null
estos tienen su valor por defecto Objeto por defecto: null
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
103

209

Arrays Multidimensionales

Es un array en el que el acceso a los elementos se


hace utilizando ms de un ndice 0 1 2
2 r s t
1 j k l
0 1 2 0 a b c t
l
i
0
A B C 0 a b c
w

r
1 D E F 1 d e f
z
q
2 G H I 2 g h i z

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
... ...

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

210

Vectores
Qu son?

Coleccin de elementos de tipo Object


Puede crecer o reducirse dinmicamente segn
el n de elementos
Permite acceder a los elementos mediante un
ndice pero no mediante [ ]
Tamao
El mtodo capacity() devuelve el n de elementos que
puede contener el vector
El mtodo size() devuelve los que en realidad
contiene
La variable CapacityIncrement indica la variacin de
tamao del vector cuando necesite crecer
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
104

211

Vectores
Qu son? Mtodos constructores

Deriva de la clase Object


Implementa el interfaz Cloneable (para poder
sacar copias con el mtodo clone)
Implementa el interfaz Serializable (para poder
convertirse en una cadena de caracteres)
Constructores Significado
Vector() Crea un vector vaco
Vector( int capacity) Crea un vector de capacidad capacity
Vector(int capacity , int capacityIncrement ) Crea un vector con la capacidad y el incremento de
capacidad indicados

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

boolean contains( Object elem) Comprueba si el vector contiene el objeto elem

int indexOf(Object elem) Devuelve la posicin de la primera vez que encuentra el


objeto elem
int indexOf( Object elem, int index ) Devuelve la posicin de la primera vez que encuentra el
objeto elem a partir de la posicin index
int lastIndexOf( Object elem) Devuelve la posicin de la ltima vez que aparece elem
int lastIndexOf( Object elem, int index ) Devuelve la posicin de la ltima vez que aparece elem a
partir de la posicin index
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
105

213

Vectores
Mtodos de insercin, eliminacin, modif

Mtodos para insertar, eliminar y Significado


modificar elementos
void addElement( Object elem) Aade el objeto elem al final del vector
void insertElementAt(Objectelem, int index) Inserta el elemento elem en posicin index
void setElementAt(Objectelem, int index) Cambia el elemento en index por elem
boolean removeElement( Object elem) Elimina la primera ocurrencia de elem
void removeElementAt(int index) Elimina el elemento en la posicion index
void removeAllElements() Elimina todos los elementos

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Mtodos replicacin Significado


Object clone Devuelve una copia exacta del vector
void copyInto(ObjectanArray[]) Copia un vector en un array

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
106

215

Arrays vs Vectores
ARRAY VECTOR

Tipos de datos El que indiquemos al Elementos de tipo Object


(Vector v;)
que almacena declararlo (int a[ ])
Tamao Mediante el atributo Mediante mtodos size()
length (a.length) capacity() (v.size())

Tamao Tamao fijo indicado Puede crecer dinmicamente


en el momento de su segn se necesite
creacin (a= new a[3]) (v.addElement())

Acceso, ins, Mediante el operador Mediante mtodos:


elim, mod. indexacin [ ] (a[0 ]=2) addElement(Object obj),
removeElement(Object obj),
insertElementAt(Object obj, int index )
Est definido en El lenguaje Java La biblioteca de clases

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

216

Streams
Lectura/Escritura

abrir stream apropiado EN EL PAQUETE


java.io EXISTEN
mientras haya datos
Algoritmo: MUCHAS CLASES
leer/escribir en stream DE Stream
cerrar stream (ver ANEXO)
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
107

217

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 => pantalla o red
3. Clase que implemente las operaciones sobre el flujo de salida
PrintStream

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

File archivo=new File(datos.salida);


FileOutputStream flujoarchivo=
new FileOutputStream (archivo);
PrintStream destino = new PrintStream (flujoarchivo);
destino.println(Hola archivo);

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
108

219

Streams
Lectura de archivos

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)
3. Clase que ofrezca las operaciones de lectura (readline)
BufferedReader
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
109

221

Streams
Lectura de teclado/fichero
FICHERO TECLADO

File f=new File(Fichero.in)


FileInputStream is=new FileInputStream(f) BufferedInputStream is=System.in;

InputStreamReader isr;
BufferedReader entrada;
Isr=new InputStreamReader (is);
Entrada=new BufferedReader (isr);
Entrada.readLine ();

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
110

223

Streams
Lectura de una URL

URL u=new URL(http://www.ehu.es);


//contactar con la mquina, esperar respuesta
// establecer conexin
FilterInputStream fs=u.openStream();

InputStreamReader isr=new InputStreamReader (fs);


BufferedReader ehuURL=new BufferedReader(isr)
System.out.println(ehuURL.readLine ());

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

224

Streams
Lectura de un fichero binario de una vez

Leer un fichero .gif en Internet con una nica


operacin de lectura...
CLAVES:
Abrir la URL, pero no para leer texto de ella
URL url = new URL(http://www...gif);
InputStream ent = url.openStream();
Leer del stream en un array de bytes
byte[] tBytes = new byte(5000);
int cuantosLeidos = ent.read(tBytes);

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
111

225

Streams
Lectura de un fichero de una vez

Abrir un fichero como entrada


FileInputStream nombre =
new FileInputStream(
new File(NombreFich.dat))
Leer el fichero en un array de bytes.
byte[] tBytes = new byte(5000);
// tBytes es un array de 5000 bytes
int cuantosLeidos = nombre.read(tBytes);
// lee todo lo que puede del fichero
// devuelve el nm. bytes ledo.
// No hace falta ver si es EOF ni usar
// un bucle (si fich. cabe en el array)
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
112

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
113

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
114

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)

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU


...

package ejISO; /** 232


import java.io.*; * Mtodo que conecta la entrada a un fichero
import java.net.*; * @param fich String que contiene el nombre del fichero
import java.util.*; **/
/** public void setLectorFichero(String fich ) throws java.io.FileNotFoundException
* Los objetos de esta clase leen de una entrada y escriben en {
* una salida. Cuando se crea cada objeto, la entrada se asocia a la input = new FileReader(fich );
* entrada estndar y la salida a la salida estndar. Se }
* puede conectar la entrada a ficheros o URLs y la /**
* salida a ficheros. * Mtodo que conecta la salida a un fichero
* @author Prof. ISO * @param fich String que contiene el nombre del fichero
**/ **/
public class LectorEscritorTexto { public void setEscritorFichero(String fich ) throws java.io.IOException {
output = new FileWriter(fich ); }
InputStreamReader input;
OutputStreamWriter output; /**
Vector vector; * Mtodo que lee de la entrada definida en ese momento y almacen a
* el contenido dentro del propio objeto.
public final static int MAXIMO = 10000; **/
public void leer() throws java.io.IOException {
/** BufferedReader bufInput = new BufferedReader(input);
* Constructor de la clase. Asocia la entrada a la String linea;
* entrada estndar y la salida a la salida estndar vector.removeAllElements();
**/ while ((linea=bufInput.readLine())!=null)
public LectorEscritorTexto() { vector.addElement(linea);
input = new InputStreamReader(System.in); bufInput.close(); }
output = new OutputStreamWriter(System.out);
vector = new Vector(); /**
} * Mtodo que escribe en la salida definida en ese momento el
/** * contenido que previamente se ha ledo al ejecutar el mtodo leer()
* Mtodo que conecta la entrada a una URL **/
* @param url String que contiene la URL public void escribir() throws java.io.IOException {
**/ PrintWriter printOutput = new PrintWriter(output);
public void setLectorURL(String url) for (int i=0;i<vector.size();i++)
throws java.net.MalformedURLException, printOutput.println((String)vector.elementAt(i));
java.io.IOException{ printOutput.close();
URL laUrl = new URL(url ); }
InputStream ent = laUrl.openStream(); public static void main(String argv[])
input = new InputStreamReader(ent); } { .... }
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU }

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
115

233

Principio de Auto-Documentacin

Meyer ha identificado cinco principios


para la construccin de software OO
Unidades modulares lingsticas
Auto-Documentacin
Acceso Uniforme
Abierto-Cerrado
Eleccin nica
Principio de Auto-Documentacin: El
diseador de un mdulo debe
esforzarse en que toda la informacin
relativa al mdulo forme parte del
propio mdulo.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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.

@exception name description Mtodos Excepciones que el mtodo puede


elevar. Se pone una etiqueta para cada
excepcin posible.
@param name description Mtodos Para describir los parmetros, su
utilizacin y su tipo. Se pone una
etiqueta para cada parmetro.
@return description Mtodos Para describir los valores devueltos por
cada mtodo y su tipo.
@since Clases, mtodos Desde qu versin est. Ej: desde
.JDK 1.1
@ see ClassName Clases, interfaces, Pondr la direccin para conectarse
mtodos y atributos. con esta clase en la documentacin
@see ClassName#NombreMtodo Clases, interfaces, Pondr la direccin para conectarse
mtodos y atributos. con este mtodo en la documentacin.
@version text Clases, interfaces. Informacin acerca de la versin.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
116

235

Wrappers

Tratan a los tipos bsicos como objetos


Permiten almacenar tipos bsicos en
estructuras que slo permiten almacenar
objetos.
Existe una clase wrapper para cada uno de
los tipos bsicos
Ejemplos: Integer, Character, Float .....

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

236

Wrappers
Ejemplo clase Integer

La clase miVector gestiona una lista de


elementos (vector) y dispone de los
siguientes mtodos:
void add (int i);
float getMedia();
Implementar dicha clase

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
117

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

Mtodos de instancia Significado


int intValue() Devuelve el valor entero
byte byteValue() Devuelve el valor como un byte
long longValue() Devuelve el valor como un long
int compareTo(Integer i) Lo compara con otro Integer numericamente
String toString() Devuelve un String con el contenido del Integer
Mtodos de clase Significado
int parseInt(String s) Devuelve un int con el valor del String s
Integer valueOf(String s) Devuelve el Integer con el valor del String s

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
118

239

Objetivos II:
Cmo utilizamos las clases existentes y desarrollamos nuevas

Utilizacin
Libreras Creacin
Ejemplos de uso
Vector, Stream, Wrappers

if / if ... else / switch


Sentencias
Java for
while / do ... while

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
119

241

Sentencias Java
Sentencias: ?

El operador ? : de C tambin existe:

max = (a>b) ? a : b;

equivalente a

if (a>b) max=a; else max=b;

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
120

243

Sentencias Java
Bucles

Bucles
while(Expresin-booleana)
acciones
do
acciones
while(Expresin-booleana);

for(inicializacin; Expresin-booleana; paso)


acciones

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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();
}}

Se pueden definir variables en cualquier sitio: int i;


A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
121

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
122

247

Excepciones

Qu son
Para qu sirven
Qu tipos hay
Como utilizarlas

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

248

Excepciones
Qu son?

Evento que al ocurrir impide la ejecucin normal


del programa
Cuando ocurre se crea un objeto excepcin y se pasa
el control al sistema de control de ejecucin
El sistema de control de ejecucin
Busca un trozo de cdigo que maneje la excepcin
Si no lo encuentra termina el programa

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
123

249

Excepciones
Para qu sirven?

Para separar el tratamiento de excepciones del


cdigo normal (try-catch)
Para propagar errores en la pila de llamadas(throws )
Para agrupar y diferenciar tipo de errores (al ser
objetos pueden agruparse en clases)
Cualquier mtodo tiene que
Tratar (catch) o
Pasar (throws )
Cualquier excepcin producida durante su ejecucin

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

250

Excepciones
Qu tipos hay?

Hay fundamentalmente 3 tipos:


De tiempo de ejecucin (RunTimeException)
De entrada salida (java.io.*)
Definida por el usuario (MyException)
En tiempo de compilacin se comprueba que los
dos ltimo tipos de excepciones:
Se capturen o
Se declaren en los metodos en lo que puedan
darse

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
124

251

Excepciones
Ejemplos frecuentes

RuntimeException
ArithmeticException
NumberFormatException
IndexOutOfBoundException
NullPointerException
Java.io.*
EOFException
FileNotFoundException
IOException

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
125

253

Anexo: Character Streams

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

254

Anexo: Byte Streams

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
126

255

Streams de Fuente de datos

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

256

Streams de proceso de datos

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
127

257

Tema 2.4

Construccin de Software
Orientado a Objetos en Java

Programacin orientada a objetos


Herencia
Herencia mltiple
Genericidad

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
128

259

ndice

Herencia mltiple
Clases abstractas e interfaces
Para qu sirven los interfaces?
La superclase java.lang.Object
mtodos clone() y equals()
Genericidad

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
129

261

Herencia

public class Punto {


private double x,y;
public Punto(double x,double y) {
this.x=x;
this.y=y; }
public double getX() {return x;}
public double getY() {return y;}
public double distancia(Punto p) {
return Math.sqrt(
Math.pow(p.getX()-x,2)+Math.pow(p.getY()-y,2));
}}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

262

Herencia

public class Poligono {


Vector listaOrdenadaPuntos; // Lista ordenada de puntos. Se supone correcta
public Poligono() {
listaOrdenadaPuntos = new Vector(); }
public void addPunto(Punto p) { listaOrdenadaPuntos.addElement(p);}
public int numLados() { return listaOrdenadaPuntos.size()-1;}
public void dibujar() { System.out.println("Falta implementarlo");}
public double perimetro() {
double per = 0.0;
Punto prim = (Punto)listaOrdenadaPuntos.elementAt(0);
for (int i=1;i<listaOrdenadaPuntos.size();i++) {
Punto sig = (Punto)listaOrdenadaPuntos.elementAt(i);
per += prim.distancia(sig);
prim=sig; }
per += prim.distancia((Punto)listaOrdenadaPuntos.elementAt(0));
return per; } }
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
130

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

diagonal1(): Lnea Adems se pueden definir


diagonal2(): Lnea nuevos mtodos y atributos.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
131

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
132

267

Herencia

// continuacin de la clase Rectangulo


public Linea diagonal1() {
return new Linea(new Punto(xIzq,yArr),
new Punto(xDer,yAba));}
public Linea diagonal2() {
return new Linea(new Punto(xIzq,yAba),
new Punto(xDer,yArr));}
} public class Linea {
private Punto p1,p2;
public Linea(Punto p1,Punto p2) {
this.p1=p1; this.p2=p2; } }
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

268

Herencia

Punto pt10 = new Punto(3,2.5);


Rectangulo rt1 = new Rectangulo(pt10,4,3);

Cmo crear este objeto rectngulo?

(1,1) (5,1) @Pt6 1.0 1.0 @Pt9 1.0 4.0


@Pt7 5.0 1.0
(3,2.5)
@Pt8 5.0 4.0 @Pt10 3.0 2.5

(1,4) (5,4) @Rt1 <@Pt6,@Pt7,@Pt8,@Pt9>


@Pt10 4.0 3.0

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
133

269

Redefinicin de mtodos

Se pueden redefinir los mtodos


heredados, esto es, darles nuevas
implementaciones.
Si se desea, se puede ejecutar el
mtodo heredado de la clase padre:
super(...)
Si se trata de un mtodo constructor
super.metodoHeredado(...parmetros...)
Si es un mtodo no constructor

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
134

271

Redefinicin de mtodos

public class Rectangulo extends Poligono {


private Punto centro;
private double lado1, lado2;
.........................................................
public double perimetro() {
return 2*(lado1+lado2);
}}

Si se quisiera, dentro de la implementacin de perimetro(), llamar


a la implementacin heredada de permetro podramos hacerlo:

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
135

273

Otro ejemplo

Suponiendo que la clase Coche funciona


correctamente y que hay varias aplicaciones
que la utilizan
Qu sucedera si se quisiera aadir una
nueva restriccin que dijera que la velocidad
mxima debe ser 100 km/h.? NUEVO REQUISITO
Si se cambia la clase Coche entonces puede no ser
aceptable para aplicaciones ya existentes
Se puede crear una nueva clase Coche (copiando y
pegando) y aadirle la nueva restriccin, pero si se
descubrieran bugs habra que corregirlos en las
clases Coche antigua y nueva

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
136

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

Como velocidad es atributo private, entonces la


clase Coche debera proporcionar los mtodos
getVelocidad() y setVelocidad(v)

if (getVelocidad() > limVeloc) {setVelocidad(limVeloc);}


A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
137

277

Significado de la herencia

El punto de vista de tipo


Un tipo es un conjunto de objetos caracterizados
por ciertas operaciones
Un descendiente describe un subtipo del tipo del
padre
EJEMPLO: la clase Rectangulo usa la clase Poligono para indicar
que un subconjunto de los objetos de la clase Poligono son objetos
de la clase Rectangulo

La herencia sirve para especializar los tipos


(en realidad las clases)
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
138

279

Principio Abierto-Cerrado

Meyer ha identificado cinco principios para la


construccin de software OO
Unidades modulares lingsticas
Auto-Documentacin
Acceso Uniforme
Abierto-Cerrado
Eleccin nica
Principio Abierto-Cerrado: un mdulo debe
ser extensible, pero a la vez acabado para
poder ser utilizado por otros mdulos

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

280

Principio Abierto-Cerrado
X EST CERRADA Clase A

Clase X met1(X par,...)


usa
Clase B
usa atr: X

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
139

281

Clase/Mtodo/Atributo final

Una clase declarada como final no puede ser


heredada por otra
public final class CocheEsp {...}
Un mtodo declarado como final no puede
ser redefinido en otra subclase
public final String visualizar()
Una variable de instancia declarada como
final tampoco puede cambiar su valor una
vez dado (til para definir constantes en una
clase, definidas como static final)
public static final double c = 2.998E8;
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
140

283

Polimorfismo
Ejemplo 2

Dado este mtodo de la clase Utilities,


static float pinta(Poligono p,String color){..}
y el siguientes objeto:
Rectangulo r = new Rectangulo();
y se realiza la siguiente llamada
Utilities.pinta(r,rojo);

En el cuerpo del mtodo pinta, p apuntar a un


rectngulo y no a cualquier polgono
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

284

Polimorfismo
Qu sucede exactamente durante una
conexin polimorfa?
Tras ejecutar
p = r;

Un POLGONO no se transforma en un RECTNGULO.


Nunca sucede que un OBJETO de una CLASE se transforma
en un OBJETO de otra CLASE.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
141

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

El nico problema es que la HERENCIA debe


ser CONSISTENTE con el SISTEMA DE
TIPOS
Poligono

Rectangulo Rombo

Poligono p;
Rectangulo r;
r=p; ES CORRECTO ?
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
142

287

Polimorfismo

El compilador de Java permite ese tipo de


asignaciones, pero obliga al programador a que
explcitamente le diga que ha habido una
conexin polimorfa:
Rectangulo r =
(Rectangulo)p;

Casting
Claro, es responsabilidad del programador el
que el tipo dinmico de p sea Rectangulo...

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

288

Polimorfismo

Java ofrece la posibilidad de preguntar si un


objeto es de una determinada clase:
instanceof

Poligono p;
Linea l;
....
if (p instanceof Rectangulo)
r = (Rectangulo)p;

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
143

289

Ligadura dinmica

LIGADURA DINMICA: regla que establece


que el tipo dinmico del objeto determina la
versin del mtodo a utilizar.
Poligono p = new Poligono();
Rectangulo r = new Rectangulo();
p = r;
Si se ejecuta: p.perimetro()
Qu implementacin de perimetro() se ejecutar?
La de Polgono, ya que es su tipo esttico? La de
Rectngulo, ya que es su tipo dinmico?
Debe ser la de Rectngulo ya que es la redefinida. Esto
lo asegura la LIGADURA DINMICA

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
144

291

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
perimetroTotal += p.perimetro();
}
NUEVO REQUISITO: se quiere trabajar
tambin con tringulos issceles.
Qu habra que cambiar?
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
145

293

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;
ESTE CDIGO NO
while (...) { CAMBIARA !!!
Poligono p = panel.leerPoligono(); // Lee un POLGONO de ENTRADA
panel.aadirPoligono(p); // Aade el polgono ledo al panel grfico
perimetroTotal += p.perimetro();
}
La ligadura dinmica asegurara que, en tiempo de ejecucin, se ejecutara la versin
correcta de perimetro() cuando se tratara de un tringulo issceles
El polimorfismo y la ligadura dinmica favorecen la
EXTENSIBILIDAD y REUTILIZACIN
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
146

295

Principio de Eleccin nica

Meyer ha identificado cinco principios para la


construccin de software OO
Unidades modulares lingsticas
Auto-Documentacin
Acceso Uniforme
Abierto-Cerrado
Eleccin nica

Principio de Eleccin nica: siempre que un


sistema de software deba admitir un conjunto de
alternativas, habr un mdulo del sistema (y slo
uno) que conozca su lista completa.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

296

Herencia mltiple
Una clase como especializacin de varias

VENTAJA: se podrn heredar ms mtodos y atributos.


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

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
147

297

Herencia mltiple

PROBLEMA DE LOS CONFLICTOS DE NOMBRE.


Si hay atributos y/o mtodos con igual nombre, cules son los
que se heredarn/ejecutarn en la subclase?

A B
atribX atribX
metodY metodY

AyB

El problema de los CONFLICTOS DE NOMBRE se


puede resolver (ver libro de Meyer), pero Java ha optado
simplemente por no permitir la herencia mltiple.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

298

Clases abstractas e interfaces

Una clase es abstracta (o diferida) si tiene


algn mtodo NO IMPLEMENTADO.
Un mtodo no implementado es un mtodo abstracto

Si una clase no tiene NINGN mtodo


implementado entonces es una interfaz.
Habr otras clases, llamadas efectivas, que
implementarn los mtodos abstractos o
todos los mtodos de las interfaces.
No se pueden crear instancias directas de
clases abstractas o de interfaces.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
148

299

abstract

Una clase se puede declarar como abstract si


no va a ser implementada completamente
public abstract class Figura
Un mtodo que no va a ser implementado en
una clase sino en alguna subclase se puede
declarar como abstract (deber estar en una
clase abstract o interface)
public abstract void dibujar();
No se pueden crear instancias de clases
abstractas. Es incorrecto lo siguiente:
Figura f = new Figura();

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

300

Interfaz

Una interfaz es una estructura especial donde


todos los mtodos son abstract
todos los campos son final y static (constantes)
todos los mtodos y campos son public
public interface Comercializable {
public double calcularTarifa(); }

Las interfaces se pueden aadir a las clases


para que stas implementen los mtodos

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
149

301

Implementacin de interfaces

public class Coche extends VehicMotor


implements Comercializable {
int numRuedas = 4;
public double calcularTarifa() {
return this.precio * 0.1; }}

Se podra implementar ms de una interfaz


public class Coche extends VehicMotor
implements Importe, Serializable, Cloneable
{ int numRuedas = 4;
public double calcularTarifa() {
return this.precio * 0.1; }}

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

302

Interfaz

Una interfaz NO es una clase


Se puede declarar que el tipo de referencia de
una variable es una interfaz
Stack s
s puede hacer referencia a cualquier objeto de cualquier
clase que implemente la interfaz s
Todo objeto de una clase que implemente la
interfaz, se considera un objeto del tipo interfaz
StackArray sa
sa instanceOf Stack => true

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
150

303

Para qu sirven las interfaces?

1) Para poder suplir la carencia de


herencia mltiple en JAVA
2) Agrupacin de comportamiento comn
independientemente de la jerarqua a la
que pertenezca
3) Se puede utilizar una interfaz para
definir atributos semnticos de clases

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

public class Avion {


private int numPasajeros; ... public interface Activo {
AvinCompaa
public void despega() {...} void pagoMensualidad();
... public class AvionCompaniaextends Avion }

} implements Activo {
private float precioCompra, valorVenta, depreciacion;

public void pagoMensualidad() { // IMPLEMENTACIN }}


A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
151

305

Para qu sirven las interfaces?(II)

Agrupacin de comportamiento comn


independientemente de la jerarqua a la
que pertenezca.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

306

Para qu sirven las interfaces?(II)

clase1 clase2 clase3


m1 m1 m1
m2 m2 m2

Jerarqua 1 Jerarqua 2 Jerarqua 3

Cmo podemos agrupar el comportamiento


asociado a los mtodos m1 y m2 ?
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
152

307

Para qu sirven las interfaces?(II)


interface myInterface {
m1();
m2();
}

clase1 clase2 clase3


implements myInterface implements myInterface implements myInterface

Jerarqua 1 Jerarqua 2 Jerarqua 3

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

308

Para qu sirven las interfaces?(II)


interface Secuencializable {
hayMas():boolean
siguiente():Object
}

Grupo Reunin Exposicin


implements Secuencializable implements Secuencializable implements Secuencializable

Jerarqua 1 Jerarqua 2 Jerarqua 3

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
153

309

2) Para qu sirven las interfaces?


Interface Secuencialiable
Clase Utilidades usa hayMas(): boolean
save(s:Secuencializable)
siguiente(): Object

public class Utilidades {


public void save(s Secuencializable) {
Object elem;
public interface Secuencializable{
while (s.hayMas()){
elem = s.siguiente(); boolean hayMas();
//Almacena el elemento int siguiente();}
}
}

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

310

2) Para qu sirven las interfaces?


public class Utilidades {
public void save(s Secuencializable) {
Object elem;
while (s.hayMas()){
elem = s.siguiente();
//Almacena el elemento
}
}

COROLARIO: Permiten que una clase utilice mtodos


proporcionados por objetos de otras clases independientemente de
la clase a la que pertenezcan

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
154

311

2) Para qu sirven las interfaces?


Interface Secuencialiable
Clase Utilidades usa hayMas(): boolean
save(s:secuencializable)
siguiente(): Object

Clase Exposicin

Entonces, si se quiere utilizar (REUTILIZACIN de


software) el mtodo save de la clase Utilidades
con un objeto de una clase cualquiera (por ejemplo
Exposicin), basta con que dicha clase implemente
los mtodos de la interface Secuencializable:
hayMas() y siguiente()
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

312

2) Para qu sirven las interfaces?

Clase Utilidades Interface Secuencialiable


usa
save(s:secuencializable) hayMas(): boolean
siguiente(): Object

Grupo Reunin Exposicin


implements Secuencializable implements Secuencializable implements Secuencializable

Jerarqua 1 Jerarqua 2 Jerarqua 3

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
155

313

2) Para qu sirven las interfaces?


clase Secuencialiable
Clase Utilidades usa hayMas(): boolean
save(s:Secuencializable)
siguiente(): Object

Clase Exposicin

Si Secuencializable hubiera sido una clase en vez de una


interface, entonces slo se podra utilizar el mtodo save de la
clase Utilidades con la clase Exposicin, si esta fuera
una subclase de Secuencializable . Pero eso es muy restrictivo, ya que
Java no permite herencia mltiple y es posible que Exposicin
sea subclase de otra clase.
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

314

Para qu sirven las interfaces?(III)


Se puede definir una interfaz vaca, SIN
MTODOS NI VARIABLES, para indicar
atributos semnticos de una clase.
Por ejemplo:
Supongamos que tenemos un sistema en
funcionamiento al que queremos aadir
algunas clases nuevas.
Queremos que en el nuevo sistema se sepa de
una manera sencilla si un objeto cualquiera
pertenece o no a una clase de las nuevas.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
156

315

Para qu sirven las interfaces?(III)

A Interface Nuevo
Interface sin mtodos

B
X, Y,... son las X Y
clases nuevas
C

public class X implements Nuevo {


...}
A,B y C son las
clases ya en public class Y implements Nuevo {
funcionamiento ...}
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

316

Para qu sirven las interfaces?(III)

Para saber si un objeto cualquiera obj


pertenece a una de las clases nuevas,
es suficiente este cdigo:

if (obj instanceof Nuevo){...}


else {...}

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
157

317

La superclase: java.lang.Object

La clase java.lang.Object es superclase de todas las clases.


Una clase que no extienda a otra entonces la extiende por defecto.
Sus mtodos son por tanto comunes a todo objeto:
public Object()
public final Class getClass()
public int hashCode()
public boolean equals(Object obj)
protected Object clone() throws CloneNotSupportedException
public String toString()<--- MEJOR REDEFINIR SIEMPRE
public final void notify()
public final void notifyAll()
public final void wait(long timeout ) throws InterruptedException
public final void wait(long timeout , int nanos) throws
InterruptedException
public final void wait() throws InterruptedException
protected void finalize() throws Throwable

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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.

public boolean equals(Object o) {


if (o instanceof Coche) {
Coche c = (Coche) o;
if (this.matricula.equals(c.matricula)) return true; }
return false; }
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
158

319

Mtodos de java.lang.Object

Siempre que se cambie equals() hay


que cambiar hashCode()
hashCode() debe devolver para dos
objetos iguales un mismo cdigo, por lo
que es mejor ser coherente con lo que
devuelva equals()
El cdigo devuelto se usa como ndice
para la clase java.util.Hashtable
Redefinicin de
public int hashCode() {
hashCode() para
return this.matricula.hashCode();}
Coche
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

320

Mtodos de java.lang.Object

El mtodo clone() devuelve una copia


protected native Object clone() throws CloneNotSupportedException

No todos los objetos son clonables. En


particular, slo lo son los objetos de clases
que implementan el interfaz Cloneable
public class Coche extends VehicMotor
implements Cloneable { }
Al implementar/redefinir clone() habr que
decidir si se quieren copias superficiales o
profundas

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
159

321

Genericidad

Una clase genrica es :


clase parametrizada por un tipo
el parmetro utilizado en la clase se llama
parmetro genrico formal.
Derivacin genrica: dar un parmetro
genrico actual a una clase genrica
para producir un nuevo tipo/clase.

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

322

Genericidad

Pila (G) PilaEnteros: Pila(int)

estructuras de datos estructuras de datos


cuantos(): int cuantos(): int
meter(elem: G): void meter(elem: int): void
sacar(): G sacar(): int
esVacia(): boolean esVacia(): boolean

Clase genrica Derivacin genrica


G es el parmetro int es el parmetro genrico actual
genrico formal
A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU Se obtiene una nueva clase: PilaEnteros

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
160

323

Genericidad en Java

public class Pila (G) {


...
NO SE PUEDE EN
public int cuantos() {...}
JAVA
public void meter(elem: G) {...}
public G sacar() {...} JAVA NO OFRECE
.... GENERICIDAD
}

public class PilaEntero as Pila (int)


A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU
161

325

Genericidad en Java

2 comentarios con respecto a la clase Pila:


Los tipos bsicos de Java: int, char,
float,... NO SON CLASES, as que habra
que utilizar las clases correspondientes en
java.lang: Integer, Character, etc.
Por supuesto, no se necesita volver a
implementar una pila. Para ello Java
proporciona la clase java.util.Stack

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

326

Tema 3:
Arquitecturas Software de varios
niveles en Java

A. Goi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

Ingeniera del Software


A. Goi, J.R. Zubizarreta , J. Iturrioz
Dpto. LSI. Facultad de Informtica. UPV/EHU

Você também pode gostar