apuntes de isode2en2 - siul02.si.ehu.essiul02.si.ehu.es/~alfredo/iso/tema2curso2001_02.pdf ·...
Post on 19-Sep-2018
219 Views
Preview:
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
top related