apuntes de isode2en2 - siul02.si.ehu.essiul02.si.ehu.es/~alfredo/iso/tema2curso2001_02.pdf ·...

109
53 Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. Iturrioz Dpto. LSI. Facultad de Informática. UPV/EHU A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU 109 7. Bibliografía Libro general sobre Ingeniería del Software: Ingeniería del Software. Un enfoque práctico. 5ª Edición. Roger S. Pressman. MacGraw-Hill, 2001. Para la sección 2 Construcción de Software Orientado a Objetos. 2ª Edición. Bertrand Meyer. Prentice-Hall, 1999. Capítulo 1. Para la sección 4 El Lenguaje Unificado de Modelado. El Proceso Unificado de Desarrollo de Software Jacobson, Booch, Rumbaugh. Editorial Addison Wesley, 1999 Para la sección 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 Introducción al Proceso Software Personal (PSP) Watts S. Humphrey. Addison-Wesley, 2001. A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU 110 Tema 2: Construcción de Software Orientado a Objetos en Java

Upload: lynga

Post on 19-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

53

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

109

7. Bibliografía• Libro general sobre Ingeniería del Software:

– Ingeniería del Software. Un enfoque práctico.

5ª Edición. Roger S. Pressman. MacGraw-Hill, 2001.

• Para la sección 2– Construcción de Software Orientado a Objetos.

2ª Edición. Bertrand Meyer. Prentice-Hall, 1999. Capítulo 1.

• Para la sección 4– El Lenguaje Unificado de Modelado.– El Proceso Unificado de Desarrollo de Software

– Jacobson, Booch, Rumbaugh. Editorial Addison Wesley, 1999

• Para la sección 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

– Introducción al Proceso Software Personal (PSP) Watts S. Humphrey. Addison-Wesley, 2001.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

110

Tema 2: Construcción de Software Orientado a Objetos en Java

54

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

111

IndiceIndice

•Introducción a Java

•Programación basada en objetos

•El lenguaje Java

•Programación orientada a objetos

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

112

Construcción de Software orientado a objetos en Java

Tema 2.1Tema 2.1

Introducción a Java

55

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

113

• Introducción a Java- ¿Qué es Java? Características

- Tipos de aplicaciones

- Arquitectura de desarrollo

- Anatomía de una Aplicación

IndiceIndice

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

114

Bibliografía

• http://www.bruceeckel.com/javabook.html– EDICIÓN GRATUITA ELECTRÓNICA 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

56

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

115

• El lenguaje Java fue creado por SunMicrosystems Inc.

• Aparece en el año 1995 y debe, en gran medida, su popularidad al éxito del servicio WWW.

• Los navegadores incorporan un entorno de ejecución de programas JAVA (applets).

Historia del lenguaje

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

116

• Es un lenguaje de programación.• Orientado a objetos• Adecuado a la red• Aplicaciones cliente • Aplicaciones servidor

¿Qué es exactamente JAVA?

57

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

117

Tipos de aplicaciones JAVA5 tipos básicos

Cliente:

•Aplicaciones ordinarias.

•Applets.

–Servidor

•Servlets

•JSP

•EJB

A. Goñi, 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 navegadorSe ejecuta en un contexto seguro, es decir, NO puede acceder a los recursos (memoria, disco...etc) de la máquina donde se está ejecutando

ClienteNavegador

Applet

58

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

119

Tipos de aplicaciones JAVA Clientes: Aplicaciones convencionales

Son aplicaciones Java que se ejecutan como una aplicación local sin limitaciones.

Cliente

Aplicación

A. Goñi, 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 generación de páginas dinámicas o control

Servidor

Servlet

Html

59

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

121

Tipos de aplicaciones JAVA Servidor: JSP

Páginas HTML con código Java embebido.Normalmente el código Java suele ser el encargado de acceder a alguna fuente de datos y rellenar parte de la páginaEn la primera invocación a un JSP el sistema lo transforma en un Servlet Servidor

JSP

Html <HTML>

%%Java

</HTML>

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

122

Tipos de aplicaciones JAVA Servidor: EJB

Piezas de software reutilizables implementados en JavaIndependiente de plataforma (J2EE)Tratamiento de seguridad, transacciones, sesiones declarativo

Servidor

ServletHtml

EJB

60

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

123

• Sintaxis general y estructuras de control parecidas al C.

• Orientado a objetos:– herencia– polimorfismo (late binding)– encapsulamiento (abstracción datos)

• Todo son clases: no hay estructuras de datos separadas ni variables globales.

Características del lenguaje

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

124

Programa fuente

ByteCode

Código máquina1

Compilación(Javac)

F.java

Código máquina2

Código máquina3

JVM para lamáquina 1

JVM para lamáquina 2

JVM para lamáquina 3

Clase1.classClase2.classClaseN.class

Características del lenguajeMultiplataforma

61

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

125

• Seguro– No hay punteros y no se puede acceder a posiciones arbitrarias de memoria– Hay mecanismos de excepciones. Los navegadores web comprueban los bytecodes antes de ejecutarlos

• Ejecución eficiente–Ya hay máquinas virtuales Java que ejecutan programas casi tan rápido como programas C++

Características del lenguaje

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

126

• Multi-hilo– un programa Java puede tener varios hilos (threads)

de ejecución independientes

• El linkado se hace de manera dinámica– al compilar programas java se obtienen clases

escritas en código intermedio “bytecodes”– el compilador busca clases referenciadas en el

directorio actual y en la variable de entorno CLASSPATH

• Realiza recolección de basura automática

Características del lenguaje

62

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

127

Grasp

Notepad

Otros

EditPlus

Código Java

JDK

OtrosBytecode

Herramientas de Desarrollo- JDK- Visual Café- Java Workshop- Jbuilder- Jdeveloper- J++- Visual Age

Editores Compiladores

fichero.java fichero.class

javac fichero.java

Arquitectura de desarrollo

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

128

Arquitectura de ejecución

Aplicaciones en formato Bytecode

Cargador de clasesVerificador de Bytecode

Java Class Libraries(Java extension Apis)

Java Class Libraries(Java Base Apis)

Java Interpreter JIT (Just in Time Compiler)

Java Runtime

Sistema Operativo

Hardware

63

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

129

Arquitectura de ejecución

•Librería de clases de java• Java Base API

• Java.lang: Interfaz y núcleo 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

130

Arquitectura de ejecución

• Cargador de clases• Verifica los bytecodes de aplicación• Carga las clases requeridas por el bytecode

• JVM (Java Virtual Machine)• Ejecuta el pseudocódigo bytecode• Dependiente del navegador Web y el S.O.• Permite dos alternativas

• Interpretar el código (Java Interpreter)• Compilar de forma dinámica

64

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

131

Qué puede fallar ?

Compilar

Cargar

Verificar

Ejecutar

“Syntax Error”

“Class not found Exception”

“Security Exception”

“Null Pointer Exception”

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

132

Por donde empezar

•Editor : JDeveloper

• Entorno de desarrollo: JDK (JDeveloper)

• Variables de entornoCLASSPATH: La lista de directorios que contienen los ficheros.class que queremos ejecutar. Debería contener al menos $JAVA_HOME/lib/classes.zipPATH: Lista de búsqueda de los ejecutables debería contener al menos $JAVA_HOME/bin

65

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

133

Como configurar las variables de entorno

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

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

Conservando el valor de las variables antiguas:

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

134

Una aplicación básica en Java

// Aplicación de ejemplo// “Hola Mundo”//class HolaMundo{public static void main(String args[]){

System.out.println(“Hola Mundo”);}

}

HolaMundo.class

HolaMundo.java

1. Compilamos: javac HolaMundo.java

2. Ejecutamos: java HolaMundo

66

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

135

Anatomía de una aplicación

// Aplicación de ejemplo// “Hola Mundo”//class HolaMundo{

public static void main(String args[]){System.out.println(“Hola Mundo”);

}} •Comentarios (3 tipos)

// Para comentar una línea /*Para comentar

una línea o más*//**Para documentación usando javadoc*/

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

136

Anatomía de una aplicación

// Aplicación de ejemplo// “Hola Mundo”//class HolaMundo{

public static void main(String args[]){System.out.println(“Hola Mundo”);

}} Declaración de la clase

El nombre de la clase (que debe ser igual que eldel fichero fuente HolaMundo.java) se utiliza para crear el fichero class en el mismo directorioen el que se compila la aplicación.

67

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

137

Anatomía de una aplicación

// Aplicación de ejemplo// “Hola Mundo”//class HolaMundo{

public static void main(String args[]){System.out.println(“Hola Mundo”);

}} Método main

• Es el método que busca el intérprete para ejecutar en primer lugar.

• Se le pasa como argumento un array de objetos String llamado args.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

138

Anatomía de una aplicación

// Aplicación de ejemplo// “Hola Mundo”//class HolaMundo{

public static void main(String args[]){System.out.println(“Hola Mundo”);

}} public

Indica la accesibilidad del método. Unmétodo público puede ser llamado por cualquiera, incluyendo el intérprete java

68

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

139

Anatomía de una aplicación

// Aplicación 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 método de clase, es decir se refiere a toda la clase y no a ninguna instancia en particular. Sialguien instancia esta clase el método mainno se instanciaría.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

140

Anatomía de una aplicación

// Aplicación de ejemplo// “Hola Mundo”//class HolaMundo{

public static void main(String args[]){System.out.println(“Hola Mundo”);

}} void

• Indica que el método main no devuelveningún valor.

• Es importante indicar el valor de retorno porque java hace una comprobación estricta de tipos.

69

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

141

Anatomía de una aplicación

// Aplicación de ejemplo// “Hola Mundo”//class HolaMundo{

public static void main(String args[]){System.out.println(“Hola Mundo”);

}} String args[]

• Es la declaración de un array de Strings• Son los argumentos que se pasan por la

línea de comandos.

java HolaMundo arg1 arg2 ...

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

142

Anatomía de una aplicación

// Aplicación de ejemplo// “Hola Mundo”//class HolaMundo{

public static void main(String args[]){System.out.println(“Hola Mundo”);

}} Funcionalidad

• Utiliza el método println perteneciente objetoapuntado por el atributo out de la clase System.

• El método println toma como argumento una cadena (String) y la saca por la salida estándar (es decir por pantalla).

70

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

143

Construcción de Software Orientado a Objetos en Java

Tema 2.2Tema 2.2

Programación basada en objetosClases y objetos

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

144

Objetivos

• Definir los conceptos básicos de la programación basada en objetos.

- clases, objetos- miembros (variables, métodos)- abstracción y ocultación de la información

• Describir relación entre clases y objetos• Crear un objeto sencillo y modelar

- sus atributos (por medio de variables)- su comportamiento (por medio de métodos)

71

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

145

¿Qué es un objeto ?

•Los objetos son representaciones (simples/complejas)(reales/imaginarias) de cosas: reloj, avión, empleado, etc.•No todo puede ser considerado como un objeto, algunascosas son simplemente características o atributos de los objetos: color, velocidad, etc.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

146

¿Qué es un objeto ?

• Abstracción funcional-Hay cosas que sabemos que los coches hacen pero no como lo hacen:

• avanzar• parar• girar izda• girar drcha

• Abstracción de datos- Un coche además tiene

ciertos atributos:• color• velocidad• marca• etc..

- La forma en la que sedefinen los atributos no tiene importancia en el diseño

72

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

147

Qué es un objeto ?

Abstracción funcional Abstracción de datos

Métodos Variables

Miembros públicos Miembros privados

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

148

Miembros públicosLos miembros públicos (describen qué pueden hacer los objetos de esa clase)

- Comportamiento del objeto.

Miembros privadosDescriben la implementación de cómo se hace:- Ejemplo: el método girar llave del objeto contacto interacciona con el circuito eléctrico del vehículo, este con el motor, etc.

- En sistemas orientados a objetospuros todo el estado es privado y solo se puede cambiar a través de la interfaz pública

- Ej: el método público frenar puede cambiar el valor del atributo privadovelocidad

Qué es un objeto ?Definiciones

73

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

149

• Encapsulación: describe la vinculación de un comportamiento y un estado a un objeto en particular.

• Ocultación de información: Permite definir qué partes del objeto son visibles (el interfaz público) que partes son ocultas (privadas)

La llave de contacto es un interfaz público delmecanismo de arranque de un cocheLa implementación de cómo arranca realmente es privada y sobre ella sólo puede actuar la llave de contacto

El objeto puede cambiar y su interfaz público ser compatiblecon el original esto facilita la reutilización de código

Ventajas

Qué es un objeto ?Definiciones

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

150

MIEMBROS DE UNA CLASE

Los objetos encapsulan variables permitiendo acceso a ellas únicamente a través de los métodos•Variables: Contenedores de valores•Métodos: Contenedores de funciones

Un objeto tiene:Estado : representado por el contenido de sus variables o atributosComportamiento definido por sus métodos

Normalmente:•Los métodos son públicos•Las variables son privadas•Puede haber métodos privados•Es peligroso tener variables públicas

Qué es un objeto ?Encapsulación de objetos

74

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

151

• Clase: Conjunto de objetos con estados y comportamientos similares

• Podemos referirnos a la clase“coche” (cualquier instancia de la clasificación coche)

• “Mi coche” que es un objeto, es decir una instanciaparticular de la clase coche

• La clasificación es arbitraria, depende del problema a resolver

Qué es un objeto ?Clasificación de objetos

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

152

Objetos vs. Clases

Una clase es una entidad abstracta- Es un tipo de clasificación de datos- Define el comportamiento y atributos de un grupo de

de estructura y comportamientos similar Clase CocheMétodos: arrancar, avanzar, parar, ...Atributos: color , velocidad, etc.

Nombre de la claseMétodos (funciones)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.

Objeto FerrariPerteneciente a la clase Coche

Nombre: FerrariMétodos: arrancar, avanzar, parar,...Atributos: color=“rojo”;

velocidad=300Km/h

75

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

153

Interacciones entre objetos

•El modelado de objetos modela:•los objetos y•sus interelaciones

•Para realizar su tarea el objeto puede delegartrabajos en otro que puede ser parte de él mismo o de cualquier otro objeto del sistema.•Los objetos interaccionan entre sí enviándose mensajes

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

154

Paso de Mensajes

• Un objeto envía un mensaje a otro- Esto lo hace mediante una llamada a sus atributos o métodos

• Los mensajes son tratados por la interfaz pública del objeto que los recibe- Eso quiere decir que sólo podemos hacer llamadas a aquellos atributos o métodos de otro objeto que sean públicos o accesibles desde el objetoque 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 métodosdel mismo objeto (públicos o privados) o de otros objetos(públicos o accesibles desde ese objeto))

Implementación

Inte

rfaz

púb

lico

Arrancar

76

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

155

Paso de mensajesEjemplo

Empresa Almacén

Facturación

Clientes

SolicitarPedido(Cliente, Artículo)

A. Goñi, 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 métodos• ¿Como podría saber el número de Empleados?

77

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

157

El Lenguaje Java

Tema 2.3Tema 2.3

Construcción de Software orientado a objetos en Java

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

158

Objetivos:Como representamos en Java las clases y los objetos

•Declaración de una clase•Declaración de una variable•Declaración de un método•Creación de un objeto

•Identificadores•Palabras reservadas•Tipos básicos en Java

OO

Java

78

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

159

Identificadores

• Sirven para nombrar variables, métodos, clases, objetos ytodo lo que el programador necesite identificar.• Comienzan con una letra, un subrayado o un símbolo $• Distinguen mayúsculas y minúsculas y no tienen longitudmáxima

• Por convenio:– Los nombres de variables, métodos y objetos comienzanpor minúscula.– Los nombres de las clases comienzan por mayúscula– Si contienen varias palabras, se unen evitando subrayadoy separando las palabras con mayúsculas deEsteModo

Los identificadores no pueden ser palabras reservadas

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

160

Palabras reservadas

79

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

161

Tipos básicos 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

162

Tipos primitivos

IMPORTANTE: Tamaño Predefinido e independiente de Plataforma java.lang

80

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

163

Tipos primitivosEl 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 >= sólo pueden ser usados con números y caracteres (no con strings, booleanos, arrays, etc.). Los operadores == y != sí pueden usarse con estos últimos

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

164

Tipos primitivosEl tipo booleano: los operadores lógicos

• && (Y lógico)• || (O lógico)• ! (NO lógico)• Los operadores && y || cortocircuitan, es

decir, evalúan 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

81

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

165

Tipos primitivosPrecedencia de operadores

• La precedencia es (de mayor a menor)!* / % + -< > <= >=== !=

&|&&||?:= (asignación)

+

-

Los operadores en la misma línea tienen IGUAL prioridad.

En ese caso se ejecutan de izquierda a derecha

Ej: 8/2*5 es ((8/2)*5) = 20

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

166

Tipos primitivosEl tipo de datos char

• Los literales de tipo carácter se escriben entre comillas simples– char micar = ‘g’;

• Caracteres especiales– \n fin de línea \b backspace– \t tabulador \” dobles comillas– \’ comilla simple \\ backslash

82

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

167

Tipos de referencia

Su valor es una referencia (puntero) al valor representado por la variable.

Ejemplo:

public class Persona{Coche suCoche;Persona suCompañero;} suCoche

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

168

•Declaración de una clase•Declaración de un atributo•Declaración de un método•Creación de un objeto

•Identificadores•Palabras reservadas•Tipos básicos en Java

OO

Java

Objetivos:Como representamos en Java las clases y los objetos

83

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

169

Declaración de una clase

(modificadores) class NombreClase{//código de la clase}

public class Coche{//Declaración de atributos// (color, velocidad, etc)//Declaración de métodos// (arrancar, parar, etc.)}

Sintaxis Estilo•Nombre fichero = nombre clase•1ª letra mayúscula• Sin espacios en blanco ni guiones• Las palabras se separan con

mayúsculas MiPrimeraClase•Indentación

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

170

Declaración de atributos

(mods) tipo nombre;(mods) tipo nombre1, nombre2;(mods) tipo nombre = valor;

public class Coche{//Declaración de atributosprivate String color;private int velocidad;//Declaración de métodos// (arrancar, parar, etc.)}

Sintaxis Estilo•Nombres intuitivos•1ª letra minúscula• Sin espacios en blanco ni guiones• Las palabras se separan conmayúsculas: miVariable•Indentación

Inicialización de lavariable a un valor

Valores por defecto de tipos básicos.

84

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

171

Accesible sólo en los métodos de la propia claseprivate

protected

Accesible para todas las clasespublic

Accesible sólo desde clases que estén en el mismo paquete(friendly)

Permisos de accesibilidad

private String color;private int velocidad;

Declaración de atributos¿Quién puede acceder al atributo?

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

172

Declaración de atributos¿Varia su valor durante la ejecución ?

• Constantes (atributos que no se pueden modificar):– usar la palabra clave final– inicializarlo obligatoriamente en la declaración

public class Coche{private final int nRuedas=4;public String color;}

85

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

173

Declaración de atributos¿A quién pertenece el atributo?

– A cada una de las instancias (una por instancia)Ejemplo: marca, matriculo, kms, color, añoMatriculación

– A la clase (static). Un solo miembro por clase, independientemente del número 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

174

Declaración de atributos¿A quién pertenece el atributo?

Coche{nRuedas=4;nCoches=3;

}

Coche3color=“blanco”;marca=“Seat”;kms=15000

Coche2color=“azul”;marca=“Opel”;kms=20000

Coche1color=“rojo”;marca=“Ferrari”;kms=10000

86

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

175

int int String

private private privateAmbito

final variable variableConstante

static static instanciaClase/Obj

nRuedas nCoches marca

Modificadores de acceso

public class Coche{int nRuedas;int nCoches;int marca;}

Declaración de atributosLos modificadores

Tipo

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

176

Declaración de métodos

public class Coche{//Declaración de atributosprivate String color;private int velocidad;//Declaración de métodospublic voidarrancar(){//código para el método arrancar}public voidavanzar(int velocidad){//código para el método avanzar}public String queColor(){//código para averiguar el colorreturn color;}

Estilo•Nombres intuitivos•1ª letra minúscula• Sin espacios en blanco niguiones• Las palabras se separan conmayúsculas miMetodo()•Indentación

87

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

177

Declaración de métodos

public class Coche{//...public voidavanzar (int velocidad) {

//codigo para el método avanzar}//...}

(modificadores) tipoRetorno NombreMetodo(tipo1 param1, tipo2 param2){//código del métodoreturn expresion; //cuando el tipoRetorno es void no es necesario}

parámetros(param1, param2)

ResultadoMétodo

Coche.java

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

178

Declaración de métodos

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

(modificadores) tipoRetorno NombreMetodo(tipo1 param1, tipo2 param2){//código del métodoreturn expresion; //cuando el tipoRetorno es void no es necesario}

parámetros(param1, param2)

ResultadoMétodo

Coche.java

88

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

179

Declaración de métodos

• Son bloques de código que describen elcomportamiento de los objetos Los métodos

– tienen 0, 1 o más argumentos (parámetros)– definen el tipo de resultado en su declaración.

(Salvo los constructores)– pueden tener variables locales. Estas variables

no se inicializan por defecto.• Si el método devuelve un resultado la última

sentencia debe ser un return• Métodos especiales

– El constructor y el método main

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

180

Declaración de métodosMétodos con argumentos: parámetros 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 PARÁMETRO POR VALOR. El valor que contiene NO PUEDE CAMBIAR DENTRO DEL MÉTODO LLAMADO (esto es, tuCoche no puede apuntar a otro objeto).

¡ PERO LOS VALORES DEL OBJETO APUNTADO POR tuCoche SÍ !

89

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

181

Declaración de métodosMétodos con argumentos: parámetros por valor

Matricula

Velocidad

BI-1123-AE

140

tuCocheCoche@125

6776 BCZ

80

miCocheCoche@129

Matricula

Velocidad

Coche@125

Coche@129

SE EJECUTA: miCoche. ponmeATuVelocidad(tuCoche);

Coche@129: Coche

ponmeATuVelocidad(Coche@125)

setVelocidad(80)

Coche@125: Coche

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

182

BI-1123-AE

80

tuCocheCoche@125

Matricula

Velocidad

Coche@125

NO SE PUEDE CAMBIAR EL CONTENIDO DE tuCoche, PERO SÍ LOS VALORES DEL OBJETO CUYA REFERENCIA SE HA PASADO POR VALOR.

Declaración de métodosMétodos con argumentos: parámetros por valor

90

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

183

Declaración de métodosSobrecarga de métodos

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 métodos print() y print(n) de la clase Punto2Dson distintos

Están sobrecargados (overloaded)

Si mipunto es un objeto de la clase Punto2D

mipunto.print(5); escribiría 5 veces las coordenadas del punto

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

184

Declaración de métodosQue sucede si se devuelven varios argumentos ?

Dado un vector devolver la media así como el número de elementosclass Utilities {

public ????????? Media (Vector v) { ...............

}}

Solución: 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 método devuelva un solo valor

91

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

185

Métodos constructores

• Cuando se crea un objeto sus miembros seinicializan con un método 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 defectoque inicializa las variables a su valor por defecto.• Si la clase tiene algún constructor el constructorpor defecto deja de existir.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

186

Métodos constructoresCreación de un objeto (instancia)

class Circunferencia {float radio;

Circunferencia(float r) { // This is the constructorradio=r;

} }

Circunferencia c;c = new Circunferencia(4.5);

Creación de un objeto de la clase Circunferencia

92

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

187

El método principal (main)

• Es el método que busca el interprete para ejecutar en primer lugar.• Los parámetros del main (String args[ ]) representan un

array de Strings que guarda los argumentos que escribimos en la línea de comandos al ejecutar el programa.java HolaMundo arg1 arg2 ...

•Normalmente se crea una clase artificial para ubicar el método main• public indica que se puede invocar de cualquier lugar• static indica que este método se refiere a toda la clase, es decir no hay un método main por cada objeto.• void indica que no devuelve ningún tipo de datos

class unaClase {public static void main(String args[ ])

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

188

class Libro {

static String editor=“UZEI” ;

int hojas; }

class Libro {

static void modificarEditor1( String ed ) {

editor =ed; }

void modificarEditor2(String ed ) {

Libro. editor =ed;}

Acceso a los atributos de la clase desde los metodos

class Libro {

void incrHojas3( int h ) {

hojas=hojas+h; }

static void incrHojas4(Libro l, int h) {

l.hojas=h;}

Modificacion atributo static Modificacion atributo del objeto

1

2 4

3

93

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

189

nomClase. nomMetodo nomObjeto. nomMetodokanpotik

instancia nomClase nombreAtrib nombreAtributo

static nombreAtributo nomObjeto. nombreAtributoMétodo de la clase

Donde/Ambito static instancia

Acceso a los elementos de la clase

1324

main(String args[]) {Libro l1=new Libro(“Informatika hiztegia”);Libro.modificarEditor1(“Elhuyar”);l1. modificarEditor2(“Elhuyar”);l1.incrHojas(100);Libro.incrHohas(l1,100);

5 6

5665

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

190

Resumen

Programa

Miembros

Atributos Métodos

Tipo de Referencia

TipoBásico

Objetos??????

MétodosNormales

MétodosEspeciales

Constructor Main

Clases

94

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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;

// Método 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; } }

// (continúa)

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

192

Ejemplo de clase Java

// Métodos ACCESORES de lectura (getter)

public String getMatricula() { return this.matricula; }

public double getVelMaxima() { return this.velMaxima; }

public double getVelocidad() { return this.velocidad; }

// Métodos ACCESORES de escritura (aseguran una velocidad válida) (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; } }

}

95

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

193

Y su representación en UML

Coche- matricula: String- velocidad: double- velMaxima: double

+ Coche(matricula: String, velMaxima: double)+ getMatricula(): String+ double getVelMaxima(): double+ getVelocidad(): double+ setMatricula(matricula: String): void+ acelerarMaximo(): void+ acelerar(deltaV: double): void

Coche.java

CLASE DE DISEÑO

CLASE DE

IMPLEMENTACIÓN

SE LLAMACOMPONENTE

EN UML

Es una REALIZACIÓN en UML. EN ESTE CASO SIGNIFICA QUE EL COMPONENTE “Coche.java”

IMPLEMENTA LA CLASE DE DISEÑO Coche

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

194

Principio de Acceso Uniforme

• Meyer ha identificado cinco principios para la construcción de software OO

• Unidades modulares lingüísticas• Auto-Documentación• Acceso Uniforme• Abierto-Cerrado• Elección única

• Principio de Acceso Uniforme: Todos los servicios ofrecidos por un módulo deben estar disponibles a través de una notación uniforme, sin importar si están implementados a través de almacenamiento o de un cálculo.

96

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

195

Principio de Acceso Uniforme

Se accede de una manera uniforme a los valores de los objetos de la

clase: getVALOR()• nombre => implementado a través de almacenamiento

• fechaNac => implementado a través de almacenamiento

• edad => implementado con un cálculo

Persona

- fechaNac: Date- nombre: String

+ getNombre(): String+ getFechaNac(): Date+ getEdad(): int.....

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

196

•Declaración de una clase•Declaración de una variable•Declaración de un método•Creación de un objeto

•Identificadores•Palabras reservadas•Tipos básicos en Java

OO

Java

Objetivos:Cómo representamos en Java las clases y los objetos

97

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

197

•if / if ... else•for•while / do ... while

Librerías

SentenciasJava

•Utilización•Creación•Ejemplos de uso

•Vector, Stream, Integer

Objetivos II:Cómo utilizamos las clases existentes y desarrollamos nuevas

Excepciones

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

198

La librería de clases Java

• Java contiene una extensa librería 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 documentación 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

98

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

199

La librería de clases Java Importar clases/paquetes

• Para usar una clase de un paquete hay que añadir 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.langSystem.out.println() es en realidad una llamada al método println() del objeto almacenado en el atributo estático out de la clase java.lang.System (ese objeto es la salida estándar)

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

200

Construir paquetes propios

• Sólo puede haber una clase pública por fichero • El fichero debe llamarse igual que la clase pública que contenga

con extensión .java• La primera sentencia de cada fichero indicará el paquete en el

que se añade la clasepackage nombre_paquete;

• Para usar esas clases desde otros habrá que añadir la sentencia correspondiente:

import nombre_paquete.*;

99

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

201

• 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 encontaríaMiClase.class al encontrarse lo siguiente: importproy_uno.redes.MiClase;

Deja la clase MiClase.class en el directorio /home/misclases/proy_uno/redes (lo crea si no existe)% javac -d /home/misclasses MiClase.java

Construir paquetes propios

A. Goñi, 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

100

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

203

Arrays (Matrices)¿Qué son?

• Colección de entidades del mismo tipoalmacenadas en una unidad

• El operador indexación [ ] permite el acceso a cada elemento del array

• El atributo length nos permite saber el nº de elementos que contiene el array

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

204

Arrays (Matrices)Declaración, Creación, Inicialización

• Declaración: Consiste en asignar un identificadoral array y decir de qué tipo són los elementos que va a almacenar. – Se puede hacer de 2 formas– Después de la declaración aún no se ha asignado

memoria para almacenar el array no podemos acceder a su contenido Valores por defecto:

int, short, long = 0float, double = 0.0boleanos = false

String = nullObject = null

• Creación: Consiste en reservar espacio en memoria para el array– Es necesario utilizar new y especificar

tamaño del array– Una vez creado el array sus elementos tienen los

valores por defecto hasta que el array sea inicializado

tipo nombreArray[];tipo []nombreArray;

nombreArray = new tipo[numPosiciones];

101

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

205

Arrays (Matrices)Declaración, Creación, Inicialización

• Inicialización: Consiste en dar valores a los distintos elementos del array podemos hacerlo de varias formas:– Elemento a elemento

– Mediante un bucle

– Por asignación directa

nombreArray [0] = elemento0;nombreArray [1] = elemento1;...

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

}

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

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

206

Ejemplos: Arrays (Matrices) Declaración, Creación, Inicialización

int a[] = {1, 2, 3}; //Declaración, creación Inicialización

int a[]; //Declaraa = new int[3] //Creaa[0]=1; //Inicializaa[1]=2;a[2]=3;

int a[] = new int[3] //Declara y Creaa[0]=1; //Inicializacióna[1]=2;a[2]=3;

int a[] = new int[3] //Declara y creafor(int i=0; i<a.length;i++){ //inicializa

a[i]=i+1;}

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

MiClase a[]; //Declaraa = new MiClase[3] //Creaa[0]=new MiClase(param1);a[1]=new MiClase(param2);a[2]=new MiClase(param3);

MiClase a[] = new MiClase[3] //inicializaa[0]=new MiClase(param1);a[1]=new MiClase(param2);a[2]=new MiClase(param3);

MiClase a[] = new MiClase[3]//inicializafor(int i=0; i<a.length;i++){

a[i]=new MiClase(param-i);}

Arrays de tipos básicos

Arrays de objetos (Tipos de referencia)

102

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

207

Arrays (Matrices): Errores frecuentesDeclaración, creación, inicialización

Sintaxis

public class EjemplosMatrices{public static void main(String args[]){

double miMatriz[];System.out.println(miMatriz[0]);

}}

variable miMatriz may not have been initialized

compilar

Falla la compilación

MAL

Cuando la matriz sólo ha sido declarada no podemos acceder a sus elementos. El programa no compilaría y daría un error

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

208

Arrays (Matrices) Errores frecuentesDeclaración, creación, inicialización

public class EjemplosMatrices2{public static void main(String args[]){

int miMatrizDeEnteros[] = new int[10];float miMatrizDeReales[]= new float[10];boolean miMatrizDeBooleanos[] = new boolean[10];char miMatrizDeCaracteres[] = new char[10];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(“Carácter por defecto: " + miMatrizDeCaracteres[0]);System.out.println("String por defecto: " + miMatrizDeStrings[0]);System.out.println("Objeto por defecto: " + miMatrizDeObjetos[0]);

}}

Entero por defecto: 0Real por defecto: 0.0Booleano por defecto: falseCarácter por defecto:String por defecto: nullObjeto por defecto: null

compilar

Ejecutar

Cuando la matriz sólo ha sido declarada y creada pero no inicializada podemos acceder a sus elementos pero estos tienen su valor por defecto

103

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

209

Arrays Multidimensionales

• Es un array en el que el acceso a los elementos se hace utilizando más de un índice

IHGFEDCBA

0 1 2

0

1

2

r s tj k l

a b c

a b c

d e f

g h i

i

r

z

l

ñ

q

t

w

z

0 1 2

0

1

2

21

0

A[0][2][1]=‘l’

char a[][]; //Declaraa = new char[3][3] //Creaa[0][0]=‘A’; //Inicializa...

char a[][][]; //Declaraa = new char[3][3][3] //Creaa[0][0][0]=‘g’; //Inicializa...

A[0][2]=‘C’

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

210

Vectores¿Qué son?

• Colección de elementos de tipo Object• Puede crecer o reducirse dinámicamente según

el nº de elementos• Permite acceder a los elementos mediante un

índice pero no mediante [ ]

• Tamaño– El método capacity() devuelve el nº de elementos que

puede contener el vector– El método size() devuelve los que en realidad

contiene– La variable CapacityIncrement indica la variación de

tamaño del vector cuando necesite crecer

104

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

211

Vectores¿Qué son? Métodos constructores

• Deriva de la clase Object

• Implementa el interfaz Cloneable (para poder sacar copias con el método clone)

• Implementa el interfaz Serializable (para poder convertirse en una cadena de caracteres)

Crea un vector con la capacidad y el incremento de capacidad indicados

Vector(int capacity , int capacityIncrement )

Crea un vector de capacidad capacityVector( int capacity)

Crea un vector vacíoVector()

SignificadoConstructores

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

212

VectoresMétodos de acceso

Devuelve una enumeración con los elementosEnumeration elements()

Devuelve el elemento que hay en posición indexObject ElementAt(int index)

Devuelve el último elementoObject lastElement()

Devuelve el primer elementoObject firstElement()

SignificadoMétodos acceso

Devuelve la posición de la última vez que aparece elem a partir de la posición index

int lastIndexOf(Objectelem, int index )

Devuelve la posición de la última vez que aparece elemint lastIndexOf(Objectelem)

Devuelve la posición de la primera vez que encuentra el objeto elem a partir de la posición index

int indexOf(Object elem, int index )

Devuelve la posición de la primera vez que encuentra el objeto elem

int indexOf(Object elem)

Comprueba si el vector contiene el objeto elemboolean contains(Objectelem)

105

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

213

VectoresMétodos de inserción, eliminación, modif

Elimina la primera ocurrencia de elemboolean removeElement(Objectelem)

Elimina el elemento en la posicion indexvoid removeElementAt(int index)

Elimina todos los elementosvoid removeAllElements()

Cambia el elemento en index por elemvoid setElementAt(Objectelem, int index)

Inserta el elemento elem en posición indexvoid insertElementAt(Objectelem, int index)

Añade el objeto elem al final del vectorvoid addElement(Object elem)

SignificadoMétodos para insertar, eliminar y modificar elementos

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

214

VectoresTamaño y replicación de vectores

Establece un nuevo tamaño (puede añadir o eliminar refs)void setSize(intnewSize)

Ajusta el tamaño del vector a los elementos que realmente tienevoid trimToSize()

Comprueba si el vector está o no vacíoboolean isEmpty ()

Devuelve el nº de objetos realmente almacenados en el vectorint size()

Devuelve el nº de elementos que puede almacenar (capacidad) int capacity()

SignificadoMétodos tamaño

Copia un vector en un arrayvoid copyInto(ObjectanArray[])

Devuelve una copia exacta del vectorObjectclone

SignificadoMétodos replicación

1 2 3Vector vv.size() = 3v.capacity() = 4

106

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

215

Arrays vs Vectores

Mediante métodos: addElement(Object obj), removeElement(Object obj), insertElementAt(Object obj, int index)

Mediante el operador indexación [ ] (a[0 ]=2)

Acceso, ins, elim, mod.

Puede crecer dinámicamentesegún se necesite (v.addElement())

Tamaño fijo indicado en el momento de su creación (a= new a[3])

Tamaño

Mediante métodos size() capacity() (v.size())

Mediante el atributolength (a.length)

Tamaño

Elementos de tipo Object(Vector v;)

El que indiquemos al declararlo (int a[ ])

Tipos de datos que almacena

VECTORARRAY

Está definido en El lenguaje Java La biblioteca de clases

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

216

abrir stream apropiado

mientras haya datos

leer/escribir en stream

cerrar stream

Algoritmo:

EN EL PAQUETE java.io EXISTEN

MUCHAS CLASES DE Stream

(ver ANEXO)

StreamsLectura/Escritura

107

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

217

StreamsEscritura en archivos

Pasos para la escritura en un archivo:1. Clase que modele un fichero físico: File2. Clase que modele el flujo de salida

FileOutputStream => ficheroBufferedOutputStream => pantalla o red

3. Clase que implemente las operaciones sobre el flujo de salidaPrintStream

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

218

StreamsEscritura en archivos

Pasos para la escritura en un archivo:1. Clase que modele un fichero físico: File2. Clase que modele el flujo de salida

fileOutputStream => ficherobufferedOutputStream => teclado o red

3. Clase que implemente las operaciones sobre el flujo de salidaPrintStream

File archivo=new File(“datos.salida”);FileOutputStream flujoarchivo=

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

108

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

219

StreamsLectura de archivos

Pasos para la lectura en un archivo:1. Clase que modele el flujo de entrada (datos sin interpretar)

FileInputStream => ficheroBufferedInputStream => teclado o red

2. Clase que modele el flujo de entrada como un flujo de caracteresInputStreamReader (no reconoce final de linea o separación entre cadenas)

3. Clase que ofrezca las operaciones de lectura (readline)BufferedReader

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

220

StreamsLectura de teclado

Pasos para la lectura en un archivo:1. Clase que modele el flujo de entrada (datos sin interpretar)

fileInputStream => ficherobufferedInputStream => teclado o red

2. Clase que modele el flujo de entrada como un flujo de caracteresInputStreamReader(no reconoce final de linea o separación entre cadenas)

3. Clase que ofrezca las operaciones de lectura (readline)BufferedReader

teclado

isr

BufferedReader (creado)

System.in

InputStream

InputStreamReader(creado)

teclado

109

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

221

StreamsLectura de teclado/fichero

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

TECLADOFICHERO

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

222

StreamsLectura de una URL

teclado

isr

BufferedReader (creado)

FilterInputStream

InputStreamReader(creado)

ins internet

ordenadorremoto

URL

openStream()mensaje

return

110

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

223

StreamsLectura de una URL

URL u=new URL(“http://www.ehu.es”);//contactar con la máquina, esperar respuesta// establecer conexiónFilterInputStream fs=u.openStream();

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

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

224

• Leer un fichero .gif en Internet con una única operación de lectura...

• CLAVES:– Abrir la URL, pero no para leer texto de ellaURL url = new URL(“http://www...gif”);InputStream ent = url.openStream();

– Leer del stream en un array de bytesbyte[] tBytes = new byte(5000); int cuantosLeidos = ent.read(tBytes);

StreamsLectura de un fichero binario de una vez

111

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

225

• Abrir un fichero como entradaFileInputStream 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 bytesint cuantosLeidos = nombre.read(tBytes);// lee todo lo que puede del fichero// devuelve el núm. bytes leído. // No hace falta ver si es EOF ni usar// un bucle (si fich. cabe en el array)

StreamsLectura de un fichero de una vez

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

226

• En Java es bastante lioso trabajar con ficheros, entrada/salida estándar porque hay que escoger cuál es el Stream apropiado– En el anexo se puede apreciar que existen muchas

clases distintas– Es necesario buscar en la documentación del JDK

• Por el contrario, Java permite hacer virguerías:– Leer una URL situada en Internet como si fuera un

fichero local. – Leer un fichero y cargarlo en memoria principal con

una única operación de lectura !!!– También 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”

StreamsAlgunos comentarios

112

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

227

import java.io.*;/*** Lee texto de la entrada estándar 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."} }}

StreamsEjemplo: leer del teclado y guardar

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

228

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

StreamsEjemplo: leer de una URL y guardar

113

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

229

import java.io.*;import java.net.*;/*** Leer una URL con una sola lectura (con un MAXIMO de bytes)**/public class LeerURL1lectura {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());}}}

SE PUEDE PROBAR CON UN FICHERO .gif

StreamsEjemplo: leer de URL y guardar

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

230

LectorEscritorTexto- input: InputStream- output: OutputStream- vect: Vector

+ LectorEscritorTexto()+ setLectorURL(String URL): void+ setLectorFichero(String fich): void+ setEscritorFichero(String fich): void+ leer(): void+ escribir(): void

StreamsRealizar clase LectorEscritorTexto

114

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

231

new LectorEscritorTexto()

leer()

obj: LectorEscritorTextoobj teclado: InputStream pant: OutputStream

read()

escribir()

hasta EOF

write(elemVector)hasta fin vector

Repetir leer carácter hasta fin de entrada y guardar en un vector

setLectorFichero(nomFichE)

fichEnt: InputStreamnew(nomFichE)

leer()read()

setEscritorFichero(nomFichS)fichSal: OutputStream

new(nomFichS)escribir() write(elemVector)

Escribir vector, elemento a elemento, en la salida

...

StreamsRealizar clase LectorEscritorTexto

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

232package ejISO;import java.io.*;import java.net.*;import java.util.*;/*** 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* entrada estándar y la salida a la salida estándar. Se* puede conectar la entrada a ficheros o URLs y la* salida a ficheros.* @author Prof. ISO**/public class LectorEscritorTexto {

InputStreamReader input;OutputStreamWriter output;Vector vector;

public final static int MAXIMO = 10000;

/*** Constructor de la clase. Asocia la entrada a la* entrada estándar y la salida a la salida estándar**/

public LectorEscritorTexto() {input = new InputStreamReader(System.in);output = new OutputStreamWriter(System.out);vector = new Vector();

}/*** Método que conecta la entrada a una URL* @param url String que contiene la URL**/

public void setLectorURL(String url) throws java.net.MalformedURLException,

java.io.IOException{URL laUrl = new URL(url );InputStream ent = laUrl.openStream();input = new InputStreamReader(ent); }

/*** Método que conecta la entrada a un fichero* @param fich String que contiene el nombre del fichero**/

public void setLectorFichero(String fich) throws java.io.FileNotFoundException{

input = new FileReader(fich );}

/*** Método que conecta la salida a un fichero* @param fich String que contiene el nombre del fichero**/

public void setEscritorFichero(String fich) throws java.io.IOException {output = new FileWriter(fich ); }

/*** Método que lee de la entrada definida en ese momento y almacen a* el contenido dentro del propio objeto.**/

public void leer() throws java.io.IOException {BufferedReader bufInput = new BufferedReader(input);String linea;vector.removeAllElements();while ((linea=bufInput.readLine())!=null)

vector.addElement(linea);bufInput.close(); }

/*** Método que escribe en la salida definida en ese momento el* contenido que previamente se ha leído al ejecutar el método leer()**/

public void escribir() throws java.io.IOException {PrintWriter printOutput = new PrintWriter(output);for (int i=0;i<vector.size();i++)printOutput.println((String)vector.elementAt(i));

printOutput.close();}

public static void main(String argv[]){ .... }

}

115

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

233

Principio de Auto-Documentación

• Meyer ha identificado cinco principios para la construcción de software OO

• Unidades modulares lingüísticas• Auto-Documentación• Acceso Uniforme• Abierto-Cerrado• Elección única

• Principio de Auto-Documentación: El diseñador de un módulo debe esforzarse en que toda la información relativa al módulo forme parte del propio módulo.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

234

Principio de Auto-Documentación

• La herramienta Javadoc genera de manera automática documentación a partir de los programas fuente Java. Para ello, estos programas deben tener comentarios y etiquetas entendidas por Javadoc /** */

Etiqueta Quién lo utiliza Objetivo@author name Clases e interfaces Autor del código. Se pone una etiqueta

para cada autor.@deprecated Clases, métodos Método anticuado. Mejor no utilizarlo.

@exception name description Métodos Excepciones que el método puedeelevar. Se pone una etiqueta para cadaexcepción posible.

@param name description Métodos Para describir los parámetros, suutilización y su tipo. Se pone unaetiqueta para cada parámetro.

@return description Métodos Para describir los valores devueltos porcada método y su tipo.

@since Clases, métodos Desde qué versión está. Ej: desde.JDK 1.1

@ see ClassName Clases, interfaces,métodos y atributos.

Pondrá la dirección para conectarsecon esta clase en la documentación

@see ClassName#NombreMétodo Clases, interfaces,métodos y atributos.

Pondrá la dirección para conectarsecon este método en la documentación.

@version text Clases, interfaces. Información acerca de la versión.

116

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

235

Wrappers

• Tratan a los tipos básicos como objetos• Permiten almacenar tipos básicos en

estructuras que sólo permiten almacenar objetos.

• Existe una clase wrapper para cada uno de los tipos básicos

• Ejemplos: Integer, Character, Float .....

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

236

• La clase miVector gestiona una lista de elementos (vector) y dispone de los siguientes métodos:

• void add (int i);• float getMedia();

• Implementar dicha clase

WrappersEjemplo clase Integer

117

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

237

WrappersEjemplo 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

238

WrappersMétodos de la clase Integer

Devuelve el valor como un longlong longValue()

Lo compara con otro Integer numericamenteint compareTo(Integer i)

Devuelve un String con el contenido del IntegerString toString()

Devuelve el valor como un bytebyte byteValue()

Devuelve el valor entero int intValue()

SignificadoMétodos de instancia

Devuelve el Integer con el valor del String sInteger valueOf(String s)

Devuelve un int con el valor del String sint parseInt(String s)Métodos de clase Significado

118

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

239

•if / if ... else / switch•for•while / do ... while

SentenciasJava

Objetivos II:Cómo utilizamos las clases existentes y desarrollamos nuevas

•Utilización•Creación•Ejemplos de uso

Vector, Stream, Wrappers

Librerías

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

240

Sentencias Javaif, if-else

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

} } }

COMO EN C

if(Expresión-booleana)acciones

if(Expresión-booleana)acciones

elseacciones

condicionales

119

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

241

Sentencias Java Sentencias: ?

• El operador ? : de C también existe:

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

equivalente a

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

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

242

Sentencias Java switch

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

COMO EN C

120

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

243

Sentencias Java Bucles

while(Expresión-booleana)acciones

doacciones

while(Expresión-booleana);

Bucles

for(inicialización; Expresión-booleana; paso)acciones

A. Goñi, 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) {

System.out.print(args[i]); System.out.print(" ");i = i + 1;

}System.out.println();

}}

COMO EN C

Se pueden definir variables en cualquier sitio: int i;

121

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

245

Sentencias Java for

COMO EN C

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

}}

A. Goñi, 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;

} while (i < args.length);System.out.println();

}}

COMO EN C

122

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

247

Excepciones

•Qué son•Para qué sirven•Qué tipos hay•Como utilizarlas

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

248

Excepciones¿Qué son?

•Evento que al ocurrir impide la ejecución normal

del programa

•Cuando ocurre se crea un objeto excepción y se pasa

el control al sistema de control de ejecución

•El sistema de control de ejecución•Busca un trozo de código que maneje la excepción

•Si no lo encuentra termina el programa

123

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

249

Excepciones¿Para qué sirven?

•Para separar el tratamiento de excepciones del código 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 método tiene que

•Tratar (catch) o•Pasar (throws)

Cualquier excepción producida durante su ejecución

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

250

Excepciones¿Qué tipos hay?

•Hay fundamentalmente 3 tipos:•De tiempo de ejecución (RunTimeException)•De entrada salida (java.io.*)•Definida por el usuario (MyException)

•En tiempo de compilación se comprueba que los dos último tipos de excepciones:

•Se capturen o•Se declaren en los metodos en lo que puedan darse

124

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

251

ExcepcionesEjemplos frecuentes

•RuntimeException•ArithmeticException•NumberFormatException•IndexOutOfBoundException•NullPointerException

•Java.io.*•EOFException•FileNotFoundException•IOException

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

252

ExcepcionesEjemplos frecuentes

•Cómo se produce•Implícitamente (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 código que queremos que se ejecute siempre

125

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

253

Anexo: Character Streams

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

254

Anexo: Byte Streams

126

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

255

Streams de Fuente de datos

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

256

Streams de proceso de datos

127

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

257

Construcción de Software Orientado a Objetos en Java

Programación orientada a objetosHerenciaHerencia múltipleGenericidad

Tema 2.4Tema 2.4

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

258

Índice

• Herencia– Redefinición de métodos– Significado de la herencia– Principio Abierto-Cerrado– Clase/Método/Atributo final– Polimorfismo y Ligadura Dinámica– Utilidad del Polimorfismo y Ligadura Dinámica– Principio de Elección Única

128

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

259

• Herencia múltiple– Clases abstractas e interfaces

• ¿Para qué sirven los interfaces?

– La superclase java.lang.Object• métodos clone() y equals()

• Genericidad

Índice

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

260

Herencia

PolígonolistaOrdenadaPuntos: Vector-- constructoras + visualiz...numLados(): intperimetro(): floatdibujar(): void

Puntox, y: float-- constructoras + visualiz...distancia(otroPunto): float

(3,4)(6,2)

(7,5)

(5,7)(4,6)

@Pt1 3.0 4.0

@Pt2 4.0 6.0

@Pt3 5.0 7.0@Pt4 7.0 5.0@Pt5 6.0 2.0

@Pg1 <@Pt1,@Pt5,@Pt4,@Pt3,@Pt2>

OBJETOS:

Tenemos implementadaslas clases Polígono y Punto

129

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

262

Herencia

public class Poligono {Vector listaOrdenadaPuntos; // Lista ordenada de puntos. Se supone correctapublic 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; } }

130

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

263

Herencia

(3,4)(6,2)

(7,5)

(5,7)(4,6)

@Pt1 3.0 4.0

@Pt2 4.0 6.0

@Pt3 5.0 7.0@Pt4 7.0 5.0@Pt5 6.0 2.0

@Pg1 <@Pt1,@Pt5,@Pt4,@Pt3,@Pt2>

Punto pt1 = new Punto(3,4);Punto pt2 = new Punto(4,6);Punto pt3 = new Punto(5,7);Punto pt4 = new Punto(7,5);Punto pt5 = new Punto(6,2);Poligono pg1 = new Poligono();

pg1.addPunto(pt1);pg1.addPunto(pt2); pg1.addPunto(pt3);pg1.addPunto(pt4);pg1.addPunto(pt5);

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

264

HerenciaPolígono

listaOrdenadaPuntos: Vector-- constructoras + visualiz...numLados(): intperímetro(): floatdibujar(): void

Y queremos trabajar con una clase Rectángulo...

Rectángulocentro: Puntolado1, lado2: float

diagonal1(): Líneadiagonal2(): Línea

Si se realiza de esta manera, no hay que volver a implementar los métodos de Polígono. La clase Rectángulo los hereda de Polígono.

Además se pueden definirnuevos métodos y atributos.

131

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

265

Herencia

Además de sus propios atributos, tiene los atributos de la clase Polígono

(1,1) (5,1)

(1,4) (5,4)

(3,2.5)

@Pt6 1.0 1.0@Pt7 5.0 1.0@Pt8 5.0 4.0

@Pt9 1.0 4.0

@Pt10 3.0 2.5

@Rt1 <@Pt6,@Pt7,@Pt8,@Pt9>@Pt10 4.0 3.0

A. Goñi, 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(); Automáticamente llama a constructor vacío heredado

centro=c; lado1=l1; lado2=l2;// Añadir 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)); }

132

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

267

Herencia

// continuación de la clase Rectangulopublic 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

268

Herencia

(1,1) (5,1)

(1,4) (5,4)

(3,2.5)

@Pt6 1.0 1.0@Pt7 5.0 1.0@Pt8 5.0 4.0

@Pt9 1.0 4.0

@Pt10 3.0 2.5

@Rt1 <@Pt6,@Pt7,@Pt8,@Pt9>@Pt10 4.0 3.0

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

¿Cómo crear este objeto rectángulo?

133

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

269

Redefinición de métodos

• Se pueden redefinir los métodos heredados, esto es, darles nuevas implementaciones.

• Si se desea, se puede ejecutar el método heredado de la clase padre:– super(...)

• Si se trata de un método constructor

– super.metodoHeredado(...parámetros...) • Si es un método no constructor

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

270

PolígonolistaOrdenadaPuntos: Vector-- constructoras + visualiz...numLados(): intperimetro(): floatdibujar(): void

Rectángulocentro: Puntolado1, lado2: float

diagonal1(): Líneadiagonal2(): Línea

Queremos redefinir el método heredado de Poligonoperimetro() ya que es ineficiente

Redefinición de métodos

134

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

271

Redefinición de métodos

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 implementación de perimetro(), llamar a la implementación heredada de perímetro podríamos hacerlo:

super.perimetro();

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

272

Otro ejemplo

public class Coche { // Definida anteriormenteprivate 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; } } }

135

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

273

• Suponiendo que la clase Coche funciona correctamente y que hay varias aplicaciones que la utilizan

• ¿Qué sucedería si se quisiera añadir una nueva restricción que dijera que la velocidad máxima debe ser 100 km/h.?

• 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 añadirle la nueva restricción, pero si se descubrieran “bugs” habría que corregirlos en las clases Coche antigua y nueva

NUEVO REQUISITO

Otro ejemplo

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

274

SOLUCIÓN: crear una nueva clase CocheLento que herede de Coche y donde se redefinan los métodos necesarios.

¿Es correcto?

public class CocheLento extends Coche {private double limVeloc = 100;public CocheLento(String matricula, double velocidad,

double velMaxima) {super( matricula,

(velocidad < limVeloc) ? velocidad : limVeloc, velMaxima); }

public void acelerar(double deltaV) {super.acelerar(deltaV);if (velocidad > limVeloc) {velocidad = limVeloc;} }

Otro ejemplo

136

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

275

if (velocidad > limVeloc) {velocidad = limVeloc;}Sólo es correcto si velocidad es• public o• protected o• tiene visibilidad de paquete (friendly) y las clases Coche y CocheLento están en el mismo paquete

Como velocidad es atributo private, entonces laclase Coche debería proporcionar los métodos getVelocidad() y setVelocidad(v)

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

Otro ejemplo

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

276

Significado de la herencia

• El punto de vista modular– Módulo: conjunto de servicios ofrecidos al

exterior– Un descendiente describe una extensión del

módulo 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 código (lo que se hereda) y extenderlo (lo redefinido y/o añadido)

REUTILIZACIÓN Y EXTENSIBILIDAD

137

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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

padreEJEMPLO: 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

278

Significado de la herencia

• La paradoja de la extensión-especialización

–es una extensión, desde el punto de vista de los módulos

–es una especialización, desde el punto de vista de los tipos

138

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

279

Principio Abierto-Cerrado

• Meyer ha identificado cinco principios para la construcción de software OO

• Unidades modulares lingüísticas• Auto-Documentación• Acceso Uniforme• Abierto-Cerrado• Elección única

• Principio Abierto-Cerrado: un módulo debe ser extensible, pero a la vez acabado para poder ser utilizado por otros módulos

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

280

Principio Abierto-Cerrado

Clase Xusa

usa

met1(X par,...)

Clase A

Clase Batr: X

Estas clases NO QUIEREN que X cambie

En otro contexto se necesita usar una clase “parecida” a X:

• usar algún método de X• usar algún método de X, adaptándolo• con algún método nuevo

SOLUCIÓN: crear Y

Clase Y

X ESTÁ CERRADA

X ESTÁ ABIERTA

139

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

281

Clase/Método/Atributo final

• Una clase declarada como final no puede ser heredada por otrapublic final class CocheEsp {...}

• Un método declarado como final no puede ser redefinido en otra subclasepublic 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

282

Polimorfismo

• POLIMORFISMO es la capacidad para adaptar varias formas.

• CONEXIÓN POLIMORFA:Ej. 1) Si tenemos

Poligono p = new Poligono();Rectangulo r = new Rectangulo();

y se realiza la siguiente asignación:p = r;

p apunta a un rectángulo, no a cualquier polígono

140

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

283

PolimorfismoEjemplo 2

Dado este método de la clase Utilities, static float pinta(Poligono p,String color){..}

y el siguientes objeto:Rectangulo r = new Rectangulo();

y se realiza la siguiente llamadaUtilities.pinta(r,”rojo”);

En el cuerpo del método pinta, p apuntará a un rectángulo y no a cualquier polígono

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

284

Polimorfismo

¿Qué sucede exactamente durante una conexión polimorfa?

Tras ejecutar

p = r;

Un POLÍGONO no se transforma en un RECTÁNGULO.

Nunca sucede que un OBJETO de una CLASE se transforma en un OBJETO de otra CLASE.

141

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

285

Polimorfismo

• Tipo estático, tipo dinámico– El tipo estático es el tipo usado para declarar una

entidad. – Si en ejecución, la referencia se conecta a un objeto

de un cierto tipo, este tipo se convierte en el tipo dinámico.

Poligono p = new Poligono();TIPO ESTÁTICO DE p es PolígonoTIPO DINÁMICO DE p es Polígono

Rectangulo r = new Rectangulo();p = r;

TIPO ESTÁTICO DE p es PolígonoTIPO DINÁMICO DE p es Rectángulo

A. Goñi, 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 p;

Rectangulo r;

r=p;

Poligono

Rectangulo Rombo

ES CORRECTO ?

142

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

287

Polimorfismo

• El compilador de Java permite ese tipo de asignaciones, pero obliga al programador a que explícitamente le diga que ha habido una conexión polimorfa:

Rectangulo r = (Rectangulo)p;

• Claro, es responsabilidad del programador el que el tipo dinámico de p sea Rectangulo...

“Casting”

A. Goñi, 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;

143

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

289

• LIGADURA DINÁMICA: regla que establece que el tipo dinámico del objeto determina la versión del método a utilizar.Poligono p = new Poligono();Rectangulo r = new Rectangulo();p = r;

• Si se ejecuta: p.perimetro()• ¿Qué implementación de perimetro() se ejecutará?

– ¿La de Polígono, ya que es su tipo estático? ¿La de Rectángulo, ya que es su tipo dinámico?

– Debe ser la de Rectángulo ya que es la redefinida. Esto lo asegura la LIGADURA DINÁMICA

Ligadura dinámica

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

290

Polimorfismo/Ligadura DinámicaUtilidad

Supongamos que tenemos estas clases ya implementadas y el código de la

transparencia siguiente

PolígonolistaOrdenadaPuntos: Vector-- constructoras + visualiz...numLados(): intperimetro(): floatdibujar(): void

Rectángulocentro: Puntolado1, lado2: floatdiagonal1(): Líneadiagonal2(): Líneaperimetro(): float // REDEFINIDA

TriánguloRectángulo

centro: Puntocateto1, cateto2, hipotenusa: floatbase(): floataltura(): floatperimetro(): float // REDEFINIDA

leerPoligono(): PoligonoañadirPoligono(p:Poligono);......

PanelGrafico

usa

144

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

291

// SE LEEN VARIOS POLÍGONOS, SE AÑADEN A UN PANEL Y SE CALCULA

// EL PERÍMETRO TOTAL COMO LA SUMA DE TODOS LOS PERÍMETROS

PanelGrafico panel = new PanelGrafico();

float perimetroTotal = 0.0;

while (...) {

Poligono p = panel.leerPoligono(); // Lee un POLÍGONO de ENTRADA

panel.añadirPoligono(p); // Añade el polígono leído al panel gráfico

perimetroTotal += p.perimetro();

} NUEVO REQUISITO: se quiere trabajar también con triángulos isósceles.

¿Qué habría que cambiar?

Polimorfismo/Ligadura DinámicaUtilidad

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

292

TriánguloIsóscelescentro: PuntoladosIgual, ladoDist: floatbase(): floataltura(): floatperimetro(): float // REDEFINIDA

leerPoligono(): PoligonoañadirPoligono(p:Poligono);......

PanelGrafico

Añadir una nueva subclase de Polígono

Modificar el método leerPoligono() para que ofrezca también la posibilidad de leer

triángulos isósceles de la entrada. Este sería el único

método que conocería todos los tipos de polígonos posibles.

¿Qué habría que cambiar?

Polimorfismo/Ligadura DinámicaUtilidad

145

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

293

// SE LEEN VARIOS POLÍGONOS, SE AÑADEN A UN PANEL Y SE CALCULA

// EL PERÍMETRO TOTAL COMO LA SUMA DE TODOS LOS PERÍMETROS

PanelGrafico panel = new PanelGrafico();

float perimetroTotal = 0.0;

while (...) {

Poligono p = panel.leerPoligono(); // Lee un POLÍGONO de ENTRADA

panel.añadirPoligono(p); // Añade el polígono leído al panel gráfico

perimetroTotal += p.perimetro();

}La ligadura dinámica aseguraría que, en tiempo de ejecución, se ejecutaría la versión

correcta de perimetro() cuando se tratara de un triángulo isósceles

¡¡¡ ESTE CÓDIGO NO CAMBIARÍA !!!

El polimorfismo y la ligadura dinámica favorecen la EXTENSIBILIDAD y REUTILIZACIÓN

Polimorfismo/Ligadura DinámicaUtilidad

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

294

// SE LEEN VARIOS POLÍGONOS, SE AÑADEN A UN PANEL Y SE CALCULA

// EL PERÍMETRO TOTAL COMO LA SUMA DE TODOS LOS PERÍMETROS

PanelGrafico panel = new PanelGrafico();

float perimetroTotal = 0.0;

while (...) {

Poligono p = panel.leerPoligono(); // Lee un POLÍGONO de ENTRADA

panel.añadirPoligono(p); // Añade el polígono leído al panel gráfico

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 añadir triángulos isósceles, habría que cambiar este código. Esta forma de codificarlo implica que hay que conocer todas las opciones de polígonos aquí.

Polimorfismo/Ligadura DinámicaUtilidad

146

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

295

Principio de Elección Única

• Meyer ha identificado cinco principios para la construcción de software OO

• Unidades modulares lingüísticas• Auto-Documentación• Acceso Uniforme

• Abierto-Cerrado• Elección única

• Principio de Elección Única: siempre que un sistema de software deba admitir un conjunto de alternativas, habrá un módulo del sistema (y sólo uno) que conozca su lista completa.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

296

Herencia múltipleUna clase como especialización de varias

Activo

AviónCompañía

Avión

altitud: floatposición: float

numPasajeros: int

velocidad: floatdespega(): voidaterriza(): voidcambiaVeloc(v: float): void

precioCompra: floatvalorVenta: floatdepreciación: float

pagoMensualidad(): void

En UML es válido...

... pero en Java no se permite.

public class AvionCompaniaextends Avion, Activo {}

VENTAJA: se podrán heredar más métodos y atributos.

147

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

297

Herencia múltiple

BA

PROBLEMA DE LOS CONFLICTOS DE NOMBRE. Si hay atributos y/o métodos con igual nombre, ¿cuáles son los que se heredarán/ejecutarán en la subclase?

El problema de los CONFLICTOS DE NOMBRE se puede resolver (ver libro de Meyer), pero Java ha optado simplemente por no permitir la herencia múltiple.

AyB

atribX

metodY

atribX

metodY

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

298

Clases abstractas e interfaces

• Una clase es abstracta (o diferida) si tiene algún método NO IMPLEMENTADO.– Un método no implementado es un método abstracto

• Si una clase no tiene NINGÚN método implementado entonces es una interfaz.

• Habrá otras clases, llamadas efectivas, que implementarán los métodos abstractos o todos los métodos de las interfaces.

• No se pueden crear instancias directas de clases abstractas o de interfaces.

148

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

299

abstract

• Una clase se puede declarar como abstract si no va a ser implementada completamente public abstract class Figura

• Un método 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

300

Interfaz

• Una interfaz es una estructura especial donde– todos los métodos son abstract– todos los campos son final y static (constantes)– todos los métodos y campos son public

public interface Comercializable {public double calcularTarifa(); }

• Las interfaces se pueden añadir a las clases para que éstas implementen los métodos

149

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

301

Implementación de interfaces

Se podría implementar más de una interfaz

public class Coche extends VehicMotorimplements Comercializable {

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

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

A. Goñi, 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

150

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

303

¿Para qué sirven las interfaces?

1) Para poder suplir la carencia de herencia múltiple en JAVA

2) Agrupación de comportamiento común independientemente de la jerarquía a la que pertenezca

3) Se puede utilizar una interfaz para definir atributos semánticos de clases

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

304

¿Para qué sirven las interfaces?(I)1. Suplir la carencia de herencia múltiple en Java.

AviónCompañía

Avión

altitud: floatposición: float

numPasajeros: int

velocidad: floatdespega(): voidaterriza(): voidcambiaVeloc(v: float): void

ActivoprecioCompra: floatvalorVenta: floatdepreciación: float

pagoMensualidad(): void

public class Avion {

private int numPasajeros; ...

public void despega() {...}

...

}

public interface Activo {

void pagoMensualidad();

}public class AvionCompaniaextends Avion

implements Activo {

private float precioCompra, valorVenta, depreciacion;

public void pagoMensualidad() { // IMPLEMENTACIÓN }}

151

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

305

¿Para qué sirven las interfaces?(II)

Agrupación de comportamiento común independientemente de la jerarquía a la que pertenezca.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

306

¿Para qué sirven las interfaces?(II)

Jerarquía 1 Jerarquía 2 Jerarquía 3

clase1m1m2

clase2m1m2

clase3m1m2

Cómo podemos agrupar el comportamiento asociado a los métodos m1 y m2 ?

152

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

307

¿Para qué sirven las interfaces?(II)

Jerarquía 1 Jerarquía 2 Jerarquía 3

clase1implements myInterface

interface myInterface {m1();m2();

}

clase2implements myInterface

clase3implements myInterface

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

308

¿Para qué sirven las interfaces?(II)

Jerarquía 1 Jerarquía 2 Jerarquía 3

Grupoimplements Secuencializable

interface Secuencializable {hayMas():booleansiguiente():Object

}

Reuniónimplements Secuencializable

Exposiciónimplements Secuencializable

153

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

309

2) ¿Para qué sirven las interfaces?

Clase Utilidadessave(s:Secuencializable)

Interface Secuencialiable

hayMas(): booleansiguiente(): Object

usa

public interface Secuencializable{boolean hayMas();int siguiente();}

public class Utilidades {public void save(s Secuencializable) {

Object elem;while (s.hayMas()){elem = s.siguiente();//Almacena el elemento

} }

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

310

public class Utilidades {public void save(s Secuencializable) {

Object elem;while (s.hayMas()){elem = s.siguiente();//Almacena el elemento

} }

2) ¿Para qué sirven las interfaces?

COROLARIO: Permiten que una clase utilice métodos proporcionados por objetos de otras clases independientemente dela clase a la que pertenezcan

154

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

311

2) ¿Para qué sirven las interfaces?

Clase Utilidadessave(s:secuencializable)

Interface Secuencialiable

hayMas(): booleansiguiente(): Object

usa

Clase Exposición

Entonces, si se quiere utilizar (REUTILIZACIÓN de software) el método save de la clase Utilidadescon un objeto de una clase cualquiera (por ejemplo Exposición), basta con que dicha clase implemente los métodos de la interface Secuencializable: hayMas() y siguiente()

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

312

2) ¿Para qué sirven las interfaces?

Clase Utilidadessave(s:secuencializable)

Interface Secuencialiable

hayMas(): booleansiguiente(): Object

usa

Jerarquía 1 Jerarquía 2 Jerarquía 3

Grupoimplements Secuencializable

Reuniónimplements Secuencializable

Exposiciónimplements Secuencializable

155

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

313

Si Secuencializable hubiera sido una clase en vez de una interface, entonces sólo se podría utilizar el método save de la clase Utilidades con la clase Exposición, si esta fuera una subclase de Secuencializable. Pero eso es muy restrictivo, ya que Java no permite herencia múltiple y es posible que Exposición sea subclase de otra clase.

Clase Utilidadessave(s:Secuencializable)

clase Secuencialiable

hayMas(): booleansiguiente(): Object

usa

Clase Exposición

2) ¿Para qué sirven las interfaces?

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

314

¿Para qué sirven las interfaces?(III)

• Se puede definir una interfaz vacía, SIN MÉTODOS NI VARIABLES, para indicar atributos semánticos de una clase.

• Por ejemplo:– Supongamos que tenemos un sistema en

funcionamiento al que queremos añadir 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.

156

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

315

A

C

B

A,B y C son las clases ya en

funcionamiento

YXX, Y,... son las clases nuevas

Interface Nuevo

Interface sin métodos

public class X implements Nuevo {

...}

public class Y implements Nuevo {

...}

¿Para qué sirven las interfaces?(III)

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

316

if (obj instanceof Nuevo){...}

else {...}

Para saber si un objeto cualquiera objpertenece a una de las clases nuevas,

es suficiente este código:

¿Para qué sirven las interfaces?(III)

157

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

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 métodos 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

318

Métodos de java.lang.Object

• El método toString() por defecto escribe el nombre de la clase correspondiente al objeto. Mejor devolver valor como string

• El método equals() (al igual que el operador ==) devuelve si los objetos son idénticos. Si se desea comparar con valores => redefinir

public boolean equals(Object o) {if (o instanceof Coche) {Coche c = (Coche) o;if (this.matricula.equals(c.matricula)) return true; }

return false; }

A continuación se presenta la redefinición del método equals () para coches. Se dice que 2 coches son iguales si tienen la misma matrícula.

158

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

319

Métodos de java.lang.Object

• Siempre que se cambie equals() hay que cambiar hashCode()– hashCode() debe devolver para dos

objetos iguales un mismo código, por lo que es mejor ser coherente con lo que devuelva equals()

– El código devuelto se usa como índice para la clase java.util.Hashtable

public int hashCode() {return this.matricula.hashCode();}

Redefinición de hashCode() para

Coche

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

320

Métodos de java.lang.Object

• El método clone() devuelve una copiaprotected native Object clone() throws CloneNotSupportedException

• No todos los objetos son clonables. En particular, sólo lo son los objetos de clases que implementan el interfaz Cloneable

public class Coche extends VehicMotorimplements Cloneable { … }

• Al implementar/redefinir clone() habrá que decidir si se quieren copias superficiales o profundas

159

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

321

Genericidad

• Una clase genérica es :

– clase parametrizada por un tipo– el parámetro utilizado en la clase se llama

parámetro genérico formal.

• Derivación genérica: dar un parámetro genérico actual a una clase genérica para producir un nuevo tipo/clase.

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

322

Genericidad

Pila (G)

cuantos(): int

meter(elem: G): void

sacar(): G

esVacia(): boolean

estructuras de datos

Clase genérica

G es el parámetro genérico formal

Derivación genérica

int es el parámetro genérico actual

Se obtiene una nueva clase: PilaEnteros

PilaEnteros: Pila(int)

cuantos(): int

meter(elem: int): void

sacar(): int

esVacia(): boolean

estructuras de datos

160

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

323

Genericidad en Java

public class Pila (G) {

...

public int cuantos() {...}

public void meter(elem: G) {...}

public G sacar() {...}

....

}

public class PilaEntero as Pila (int)

NO SE PUEDE EN JAVA

JAVA NO OFRECE GENERICIDAD

A. Goñi, 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. Además la pila puede tener objetos de distintas clases.

161

Ingeniería del Software A. Goñi, J.R. Zubizarreta , J. IturriozDpto. LSI. Facultad de Informática. UPV/EHU

A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

325

Genericidad en Java

• 2 comentarios con respecto a la clase Pila:• Los tipos básicos de Java: int, char, float,... NO SON CLASES, así que habría 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. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU

326

Tema 3:Arquitecturas Software de varios niveles en Java