Desarrollo De Proyectos Informaticos Con Tecnologia Java

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

2

Esta obra de ´ Oscar Belmonte et al. est´ a bajo una licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported

´Indice general 1. Introducci´ on 1.1. Origen del lenguaje de programaci´on Java . . . . . . . . . . . . . 1.2. Caracter´ıstica de Java . . . . . . . . . . . . . . . . . . . . . . . . 1.3. El entorno de desarrollo integrado Eclipse . . . . . . . . . . . . . 1.3.1. Principales caracter´ısticas del entorno de desarrollo Eclipse 1.3.2. Descarga e instalaci´ on de Eclipse . . . . . . . . . . . . . . 1.3.3. Configurando el aspecto de Eclipse: Perspectivas y Vistas 1.3.4. El primer ejemplo . . . . . . . . . . . . . . . . . . . . . . 1.4. Herramientas de desarrollo . . . . . . . . . . . . . . . . . . . . . . 1.4.1. A˜ nadiendo nueva funcionalidad a Eclipse: los plug-ins . .

13 13 14 15 16 16 16 18 21 22

2. Clases 2.1. Definici´ on de una clase . . . . . . . . . . . . . . 2.2. Miembros de una clase . . . . . . . . . . . . . . 2.2.1. Atributos de una clase . . . . . . . . . . 2.2.2. M´etodos de una clase. . . . . . . . . . . 2.2.3. Constructores. . . . . . . . . . . . . . . 2.2.4. Sobrecarga de m´etodos y constructores . 2.3. Tipos de datos en Java. . . . . . . . . . . . . . 2.3.1. Arrays de datos en Java. . . . . . . . . . 2.4. Estructuras de control. . . . . . . . . . . . . . . 2.4.1. Estructuras de control de repetici´on. . . 2.4.2. Estructuras de control de selecci´on. . . . 2.5. Modificadores de acceso. . . . . . . . . . . . . . 2.6. Modificadores static y final. . . . . . . . . . 2.7. El recolector de basura. . . . . . . . . . . . . . 2.8. Finalizaci´ on. . . . . . . . . . . . . . . . . . . . 2.9. Comentarios. Comentarios de documentaci´on. .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

23 24 25 25 26 28 32 33 34 36 37 39 40 42 43 44 45

3. Herencia e Interfaces 3.1. Herencia. . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Extensi´ on de una clase. . . . . . . . . . . . . . . . . 3.2.1. Sobrescribir atributos. . . . . . . . . . . . . . 3.2.2. Sobrescribir m´etodos. . . . . . . . . . . . . . 3.2.3. La palabra reservada super. . . . . . . . . . . 3.2.4. El constructor por defecto y la clase Object. 3.2.5. El operador instanceof. . . . . . . . . . . . 3.2.6. El modificador final. . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

51 52 52 54 56 59 59 60 61

3

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

´INDICE GENERAL

4 . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

62 63 65 68 69 71

4. Subversion 4.1. ¿Qu´e es un sistema de control de versiones? . . 4.2. Principales caracter´ısticas de Subversion . . . . 4.3. Creaci´ on de un repositorio . . . . . . . . . . . . 4.4. Trabajo con repositorios . . . . . . . . . . . . . 4.4.1. Obteniendo informaci´on del repositorio 4.5. Integraci´ on con Eclipse . . . . . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

75 76 76 77 78 82 84

5. Excepciones 5.1. ¿Qu´e es una excepci´on? . . . . . 5.1.1. Tipos de excepciones . . . 5.2. C´ omo se gestiona una excepci´on 5.3. Creaci´ on de excepciones propias .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

87 87 88 88 91

6. Pruebas unitarias con JUnit 6.1. ¿Qu´e son las pruebas unitarias? . . . . . . . . . . . . . . . . . 6.1.1. Principios FIRST para el dise˜ no de pruebas unitarias 6.2. Pruebas unitarias con JUnit . . . . . . . . . . . . . . . . . . . 6.2.1. Creaci´ on de clases de prueba . . . . . . . . . . . . . . 6.2.2. La anotaci´on @Test . . . . . . . . . . . . . . . . . . . 6.2.3. Las anotaciones @Before y @After . . . . . . . . . . . 6.2.4. Las anotaciones @BeforeClass y @AfterClass . . . . 6.2.5. Pruebas con bater´ıa de datos de entrada . . . . . . . . 6.2.6. Ejecutar varias clases de prueba. Test Suites . . . . . 6.3. Cobertura de las pruebas . . . . . . . . . . . . . . . . . . . . 6.3.1. EclEmma y su plug-in para Eclipse . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

93 94 94 95 95 96 98 99 100 101 102 103

7. Entrada y Salida 7.1. Flujos (Streams) . . . . . . . . . . . . . . . . 7.2. Flujos de bytes . . . . . . . . . . . . . . . . . 7.3. Flujos de caracteres . . . . . . . . . . . . . . 7.4. Conexi´ on entre flujos de bytes y de caracteres 7.5. El sistema de ficheros y flujos a ficheros . . . 7.5.1. El sistema de ficheros . . . . . . . . . 7.5.2. Flujos a ficheros . . . . . . . . . . . . 7.6. Serializaci´ on . . . . . . . . . . . . . . . . . . .

3.3. 3.4. 3.5. 3.6. 3.7.

3.2.7. M´etodos static. . . . Clases abstractas. . . . . . . . Interfaces. . . . . . . . . . . . Enumeraciones. . . . . . . . . Paquetes en Java. . . . . . . . Clases e interface anidados

. . . . . .

. . . . . .

. . . . . .

. . . .

. . . . . .

. . . .

. . . . . .

. . . .

. . . . . .

. . . .

. . . . . .

. . . .

. . . . . .

. . . .

. . . . . .

. . . .

. . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

105 106 107 108 109 110 110 110 112

8. Algunas clases de utilidad del paquete est´ andar 8.1. La clase Scanner . . . . . . . . . . . . . . . . . . . 8.2. Trabajo con cadenas de caracteres . . . . . . . . . 8.2.1. La clase String . . . . . . . . . . . . . . . 8.2.2. Las clases StringBuffer y StringBuilder 8.3. Clases recubridoras . . . . . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

117 118 120 120 121 122

. . . . . . . .

. . . . . . . .

´INDICE GENERAL

5

8.4. Colecciones . . . . . . . . . . . . . . . . . . . . . . 8.5. Trabajo con fechas . . . . . . . . . . . . . . . . . . 8.5.1. La clase Date . . . . . . . . . . . . . . . . . 8.5.2. Las clases Calendar y GregorianCalendar 8.6. Matem´ aticas . . . . . . . . . . . . . . . . . . . . . 8.6.1. La clase Math . . . . . . . . . . . . . . . . . 8.6.2. La clase Random . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

124 128 128 129 129 129 130

9. Programaci´ on con gen´ ericos 9.1. ¿Qu´e son los tipos de datos gen´ericos? . . . . . . . . . 9.2. M´etodos gen´ericos . . . . . . . . . . . . . . . . . . . . 9.3. Clases gen´ericas . . . . . . . . . . . . . . . . . . . . . . 9.4. Ampliaci´ on del tipo gen´erico . . . . . . . . . . . . . . 9.4.1. Tipos gen´ericos con l´ımite superior . . . . . . . 9.4.2. Comodines . . . . . . . . . . . . . . . . . . . . 9.5. Borrado de tipo y compatibilidad con c´odigo heredado

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

133 133 134 135 138 139 139 141

10.Construcci´ on de proyectos con Ant 10.1. Qu´e es Ant . . . . . . . . . . . . . . . . . 10.2. Definici´ on del proyecto . . . . . . . . . . . 10.2.1. Objetivos . . . . . . . . . . . . . . 10.2.2. Tareas . . . . . . . . . . . . . . . . 10.3. Compilar el c´ odigo fuente de un proyecto 10.4. Propiedades . . . . . . . . . . . . . . . . . 10.5. Estructuras path-like . . . . . . . . . . . 10.6. Ejecuci´ on de las Pruebas Unitarias . . . . 10.7. Generaci´ on de la documentaci´on . . . . . 10.8. Empaquetado de la aplicaci´on . . . . . . . 10.9. Ejecuci´ on y limpieza . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

143 144 144 145 145 146 146 147 148 150 151 151

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

11.Interfaces gr´ aficas de usuario 11.1. APIs para la programaci´ on de interfaces gr´aficos de usuario en Java: AWT y Swing . . . . . . . . . . . . . . . . . . . . . . . . . 11.2. Contenedores y Componentes . . . . . . . . . . . . . . . . . . . . 11.3. Gestores de Aspecto (Layout Managers) . . . . . . . . . . . . . . 11.4. Detecci´ on de eventos: Escuchadores . . . . . . . . . . . . . . . . . 11.5. Algunos componentes Swing . . . . . . . . . . . . . . . . . . . . . 11.5.1. JLabel, muestra texto o iconos . . . . . . . . . . . . . . . 11.5.2. JButton, botones que el usuario puede pulsar . . . . . . . 11.5.3. JTextField, campos de introducci´on de texto . . . . . . . 11.5.4. JRadioButton, botones de opciones . . . . . . . . . . . . 11.5.5. JCheckBox, botones de selecci´on m´ ultiple . . . . . . . . . 11.5.6. JList, listas de selecci´on . . . . . . . . . . . . . . . . . . 11.6. El patr´ on de dise˜ no Modelo/Vista/Controlador . . . . . . . . . .

153

12.Applets 12.1. ¿Qu´e son los Applets? . . . . . . . . . . . . 12.2. Ciclo de vida de un Applet . . . . . . . . . 12.3. C´ odigo HTML para contener un Applet . . 12.4. Lectura de par´ ametros de la p´agina HTML

173 173 174 175 176

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

154 155 155 157 162 162 162 163 164 166 166 168

´INDICE GENERAL

6

12.5. Convertir una aplicaci´on Swing en un Applet . . . . . . . . . . . 176 12.6. Comunicaci´ on entre Applets . . . . . . . . . . . . . . . . . . . . . 177 13.Control de errores con MyLyn y Bugzilla 13.1. Sistema de control de tareas MyLyn . . . . . . . . . . . . . . . . 13.1.1. Cual es el objetivo de MyLyn . . . . . . . . . . . . . . . . 13.1.2. Trabajar con MyLyn . . . . . . . . . . . . . . . . . . . . . 13.2. Sistema de gesti´on de errores Bugzilla . . . . . . . . . . . . . . . 13.2.1. Cual es el objetivo de Bugzilla . . . . . . . . . . . . . . . 13.2.2. Instalaci´on de Bugzilla . . . . . . . . . . . . . . . . . . . . 13.2.3. Trabajar con Bugzilla . . . . . . . . . . . . . . . . . . . . 13.3. Acceso a Bugzilla desde MyLyn y Eclipse . . . . . . . . . . . . . 13.3.1. Beneficios de la combinaci´on de Bugzilla y MyLyn desde Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.3.2. Trabajo con MyLyn y Bugzilla desde Eclipse . . . . . . .

181 182 182 182 188 188 188 195 199 201 201

14.Programaci´ on concurrente con Hilos 207 14.1. ¿Qu´e es un hilo? Utilidades. Consideraciones sobre el uso de hilos 208 14.2. Creaci´ on de hilos en Java . . . . . . . . . . . . . . . . . . . . . . 209 14.2.1. Creaci´ on de un Hilo extendiendo a la clase Thread . . . . 209 14.2.2. Creaci´ on de un Hilo mediante una clase interna . . . . . . 210 14.2.3. Creaci´ on de un Hilo mediante una clase interna an´onima . 211 14.3. Ciclo de vida de un hilo . . . . . . . . . . . . . . . . . . . . . . . 212 14.4. Control de hilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 14.5. Sincronizaci´ on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 14.5.1. Sincronizac´on utilizando los cerrojos intr´ınsecos . . . . . . 215 14.5.2. Sincronizaci´on utilizando el interface Lock . . . . . . . 218 15.Programaci´ on para la Red 15.1. Trabajo con URLs . . . . . . . . . . . 15.1.1. ¿Qu´e es una URL? . . . . . . . 15.1.2. Leer desde una URL . . . . . . 15.1.3. Escribir a una URL . . . . . . 15.2. Trabajo con Sockets . . . . . . . . . . 15.2.1. ¿Qu´e es un Socket? . . . . . . . 15.2.2. Sockets bajo el protocolo TCP 15.2.3. Sockets bajo el protocolo UDP

. . . . . . . .

. . . . . . . .

16.Patrones de dise˜ no 16.1. Principios de POO . . . . . . . . . . . . . 16.2. ¿Qu´e son los patrones de dise˜ no? . . . . . 16.3. ¿Qu´e es el acoplamiento entre clases y por 16.4. Grupos de patrones de dise˜ no . . . . . . . 16.5. El patr´ on de dise˜ no Singleton . . . . . . . 16.5.1. Situaci´ on que intenta resolver . . . 16.5.2. Ejemplo de implementaci´on . . . . 16.6. El patr´ on de dise˜ no Factory Method . . . 16.6.1. Situaci´ on que intenta resolver . . . 16.6.2. Ejemplo de implementaci´on . . . . 16.7. El patr´ on de dise˜ no Abstract Factory . . .

. . . . . . . .

221 222 222 223 223 225 225 225 227

. . . . . . . . . . . . . . . . . . . . . . . . . . qu´e hay que evitarlo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

231 232 233 233 233 233 234 234 235 235 236 238

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

´INDICE GENERAL 16.7.1. Situaci´ on que intenta resolver 16.7.2. Ejemplo de implementaci´on . 16.8. El patr´ on de dise˜ no Strategy . . . . . 16.8.1. Situaci´ on que intenta resolver 16.8.2. Ejemplo de implementaci´on . 16.9. El patr´ on de dise˜ no Observer . . . . 16.9.1. Situaci´ on que intenta resolver 16.9.2. Ejemplo de implementaci´on . 16.10.El patr´ on de dise˜ no Decorator . . . . 16.10.1.Situaci´ on que intenta resolver 16.10.2.Ejemplo de implementaci´on .

7 . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

238 238 244 245 245 247 247 248 249 250 250

A. build.xml

255

B. Aplicaci´ on Hipoteca

259

C. Ejemplo sincronizaci´ on

265

8

´INDICE GENERAL

Prefacio La escritura de un libro es una tarea ingente. La motivaci´on para abordarla debe ser, al menos, tan grande como la tarea que se desea acometer. Para nosotros, la motivaci´ on ha consistido en escribir un libro que se distinguiera del resto de libros que abordan el aprendizaje del lenguaje de programaci´on Java. Por un lado, existen excelentes libros que muestran c´omo programar en Java. Por otro lado existen excelentes libros, en n´ umero inferior, que muestran c´omo utilizar herramientas de ayuda y soporte al desarrollo de proyectos en Java. Pensamos que, entre ellos, exist´ıa cabida para escribir un libro que abordase el aprendizaje de Java al mismo tiempo que las herramientas imprescindibles de ayuda al desarrollo. Dentro de nuestra Universidad, la Jaume I, hemos impartido, y seguimos haci´endolo, cursos sobre el lenguaje de programaci´on Java para todo tipo de alumnado: desde alumnos de las distintas titulaciones de inform´atica, alumnos extranjeros en el Master Europeo Erasmus Mundus sobre tecnolog´ıas Geoespaciales, hasta profesionales que quieren mantener al d´ıa su conocimiento y mejorar sus expectativas laborales. Esta experiencia nos ha dado la confianza suficiente como para animarnos a escribir el presente libro. Y, a pesar del contacto casi diario con Java y sus tecnolog´ıas, reconocemos que a´ un nos queda mucho por aprender, que el mundo que brinda el aprendizaje de Java es inmenso y que se renueva constantemente. Esto u ´ltimo es s´ıntoma de que la comunidad alrededor de esta tecnolog´ıa est´a viva y posee un gran entusiasmo.

Objetivos del libro Dos son los objetivos principales del este libro: Presentar el lenguaje de programaci´on Java. Presentar algunas de las herramientas de desarrollo que ayudan en el desarrollo de proyectos utilizando Java. Con un poco m´ as de detalle, en el primer objetivo hemos pretendido no s´olo presentar el lenguaje de programaci´ on, adem´as indicamos unas directrices para crear c´ odigo de calidad, c´ odigo que sea f´acil leer, f´acil mantener y que se puede probar de manera autom´ atica. El segundo de los objetivos es casi una necesidad imperiosa a los equipos de desarrollo que siguen utilizando como herramienta de control de versiones un directorio compartido. O a aquellos equipos de desarrollo que siguen probando 9

10

´INDICE GENERAL

sus aplicaciones de manera manual. O para aquellos equipos de desarrollo que utilizan como sistema de seguimiento de errores el correo electr´onico. Y un largo etc´etera de pr´ acticas desaconsejadas.

C´ omo est´ a organizado este libro La Figura 1 muestra la organizaci´on en cap´ıtulos del presente libro. Cada uno de los recuadros representa un cap´ıtulo. Los cap´ıtulos se han agrupado en dos grandes bloques. En el primero de ellos Java b´ asico hemos agrupado los cap´ıtulos que consideramos introductorios, y que representan el n´ ucleo de la programaci´on orientada a objetos en Java. En el segundo grupo Java avanzado aparecen los cap´ıtulos que consideramos aspectos avanzados del lenguaje con respecto a los cap´ıtulos del primer grupo. En ambos grupos hay cap´ıtulos que no aparecen en la l´ınea principal del flujo, estos cap´ıtulos son los que presentan herramientas que consideramos de gran utilidad en el desarrollo de proyectos inform´aticos utilizando tecnolog´ıas Java. El orden de introducci´on de estas herramientas a sido fuente de largas conversaciones: ¿Es conveniente introducir al principio la herramienta JUnit siguiendo una orientaci´ on hacia el desarrollo guiado por pruebas? ¿Debemos delegar hasta el segundo bloque de cap´ıtulos el dedicado a la construcci´on de proyectos con Ant? Hemos optado por seguir un orden quiz´as m´as conservado y menos arriesgado, intentando presentar las herramientas en el momento en que conceptualmente se entienda cual es la necesidad que vienen a cubrir. Esperamos que esta ordenaci´ on haga el tr´ansito suave entre el aprendizaje de Java como lenguaje de programaci´ on y las herramientas de ayuda al desarrollo.

Quien deber´ıa leer este libro El publico objetivo de este libro son los desarrolladores que quieran aprender el lenguaje de programaci´on Java y ya posean conocimientos de programaci´on estructurada y orientaci´ on a objetos. Los conceptos del lenguaje son presentados desde la base, suponiendo que es la primera vez que el lector se aproxima al lenguaje de programaci´ on Java. Pero este libro tambi´en est´a pensado para aquellas personas que conocen el lenguaje de programaci´ on Java y a´ un no han descubierto la gran cantidad de herramientas de ayuda que existen en el desarrollo de proyecto.

Agradecimientos La secci´ on de agradecimientos es posiblemente una de las m´as complicadas de escribir. Debe tener un equilibrio entre el espacio dedicado a ella y el reconocimiento a todas las personas, que de un modo u otro han contribuido a que un libro tenga su forma final. Para no dejarnos por citar el nombre de nadie, preferimos ampliar nuestro agradecimiento a colectivos. En primer lugar a nuestro alumnos, por que a fin de cuentas es a ellos a los que va dirigido este libro. Con sus preguntas, apreciaciones, comentarios y dudas nos han ayudado a darnos cuenta de donde estaban los escollos en la lectura de este libro.

´INDICE GENERAL

11

Figura 1: Organizaci´on del libro.

12

´INDICE GENERAL

Tambi´en a nuestros compa˜ neros de la Universidad, porque con sus comentarios y rectificaciones nos han ayudado a eliminar errores en los contenidos. Y finalmente a nuestros amigos por su ´animo constante para que esta labor llegase a buen puerto. A todos ellos gracias.

Cap´ıtulo 1

Introducci´ on Contenidos 1.1. Origen del lenguaje de programaci´ on Java . . . . 1.2. Caracter´ıstica de Java . . . . . . . . . . . . . . . . . 1.3. El entorno de desarrollo integrado Eclipse . . . . 1.3.1. Principales caracter´ısticas del entorno de desarrollo Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.2. Descarga e instalaci´ on de Eclipse . . . . . . . . . . . 1.3.3. Configurando el aspecto de Eclipse: Perspectivas y Vistas . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.4. El primer ejemplo . . . . . . . . . . . . . . . . . . . 1.4. Herramientas de desarrollo . . . . . . . . . . . . . 1.4.1. A˜ nadiendo nueva funcionalidad a Eclipse: los plug-ins

13 14 15 16 16 16 18 21 22

Introducci´ on En este cap´ıtulo de introducci´ on se muestran los or´ıgenes del lenguaje de programaci´ on Java, sus principales caracter´ısticas y las diferencias con respecto a C++, lenguaje del que hereda gran parte de la sintaxis. En la segunda parte del cap´ıtulo se presenta en Entorno de Desarrollo Integrado Eclipse, los fundamentos para crear proyectos Java utilizando este Entorno y c´ omo se puede enriquecer su funcionalidad mediante la instalaci´on de plug-ins.

1.1.

Origen del lenguaje de programaci´ on Java

El lenguaje de programaci´ on Java tiene sus or´ıgenes en un lenguaje de programaci´ on anterior, llamado Oak (roble en ingl´es), que naci´o de un proyecto interno en Sun Microsystems en el a˜ no 1991 llamado Green project. Oak fue creado con el objetivo de ser el lenguaje de programaci´on con el que programar dispositivos electr´ onicos dom´esticos, en particular aparatos de televisi´ on inteligentes e interactivos. Oak ten´ıa, entre otras, las siguientes caracter´ısticas de inter´es: 13

´ CAP´ITULO 1. INTRODUCCION

14

Orientado a objetos y de prop´osito general. Robusto. Sintaxis parecida a C++. Independiente del hardware. El proyecto de televisi´on inteligente e interactiva nunca se materializ´o. De modo simult´ aneo, a principios de la d´ecada de los 90 surgi´o Internet y con ella, la aparici´ on de los primeros navegadores web. Los l´ıderes del Green project fueron conscientes de la importancia que iba a tener Internet y orientaron su lenguaje de programaci´ on Oak para que programas escritos en este lenguaje de programaci´ on se pudiesen ejecutar dentro del navegador web Mozilla. Y este fue el inicio de Java, as´ı llamado porque cuando se intent´o registrar el nombre Oak este ya estaba registrado. Las nuevas caracter´ısticas generales que se a˜ nadieron son: Seguridad, ya que los programas que se ejecutan en un navegador se descargan desde Internet. Potencia, ya no se ten´ıa la restricci´on de la ejecuci´on en dispositivos de electr´ onica de consumo. Java se ha consolidado como lenguaje de programaci´on gracias a que su curva de aprendizaje es relativamente suave para programadores provenientes de C++. Adem´ as, la ventaja de que un programa escrito en Java se puede ejecutar en una gran cantidad de plataformas ha hecho de ´el un interesante lenguaje de programaci´ on por su ((universalidad)).

1.2.

Caracter´ıstica de Java

Java es un lenguaje de programaci´on orientado a objetos y de prop´osito general que toma de otros lenguajes de programaci´on algunas ideas fundamentales, en particular toma de Smalltalk el hecho de que los programas Java se ejecutan sobre una m´ aquina virtual . Y del lenguaje de programaci´on C++ toma su sintaxis. El uso de la m´ aquina virtual garantiza la independencia de la plataforma en Java. Si disponemos de una m´aquina virtual para nuestra plataforma, podremos ejecutar el mismo programa escrito en Java sin necesidad de volverlo a compilar. En el proceso de compilaci´on de un programa en Java, se genera un c´odigo intermedio, llamado bytecode, que la m´aquina virtual interpreta y traduce a llamadas nativas del sistema sobre el que se ejecuta la m´aquina virtual. As´ı, una m´ aquina virtual para una plataforma Windows 7 de 64 bits, traducir´a los bytecodes a c´ odigo nativo para esta plataforma, y otra m´aquina virtual para una plataforma Linux de 64 bits traducir´a los mismos bytecodes a c´odigo nativo para esta otra plataforma. Los bytecodes son los mismos en ambos casos, las m´aquinas virtuales sobre las que se ejecutan son nativas de la plataforma correspondiente. Puede parecer que este paso de traducir los bytecodes a c´odigo nativo de la plataforma suponga una p´erdida de rendimiento en la ejecuci´on de los programas en Java, pero esto no es as´ı gracias a la introducci´on de la tecnolog´ıa JIT (Just

1.3. EL ENTORNO DE DESARROLLO INTEGRADO ECLIPSE

15

In Time compilation). La idea b´ asica de esta tecnolog´ıa es que la primera vez que se llama a un m´etodo, este se interpreta generando c´odigo nativo de la plataforma sobre la que se ejecuta la m´aquina virtual, pero una vez generado este c´ odigo nativo, se almacena, de tal modo que la siguiente vez que se llama al mismo m´etodo no es necesaria su interpretaci´on ya que el c´odigo nativo para ese m´etodo se almacen´ o previamente. Otras caracter´ısticas generales de Java son: Seguridad desde el punto de vista del programador: • Comprobaci´ on estricta de tipos. • Gesti´ on de excepciones. • No existen punteros. • Recolector de basura. Seguridad desde el punto de vista del usuario de aplicaciones: • Los programas se ejecutan sobre una m´aquina virtual. • Espacio de nombre. Soporta programaci´ on concurrente de modo nativo. Los tipos de datos est´ an estandarizados. S´ olo se admite herencia simple.

1.3.

El entorno de desarrollo integrado Eclipse

Un entorno integrado de desarrollo o IDE de sus siglas en ingl´es (emphIntegrated Develop Environment) nos permite escribir c´odigo de un modo c´omodo. La comodidad reside en que los entornos de desarrollo integrados son mucho m´as que un simple editor de textos. Algunas caracter´ısticas comunes a los IDE son: Coloreado de la sintaxis. Herramientas de b´ usqueda. Asistentes para la escritura de c´odigo. Ejecuci´ on de aplicaciones sin abandonar el entorno. Herramientas de depuraci´ on de c´odigo. Junto a estas caracter´ısticas, los modernos IDE poseen algunas otras realmente espectaculares como por ejemplo: Conexi´ on con sistemas de control de versiones. Conexi´ on con sistema de seguimiento de errores. Facilidades para la creaci´ on de tareas. Herramientas avanzadas para el an´alisis de c´odigo.

´ CAP´ITULO 1. INTRODUCCION

16

Herramientas de an´alisis de rendimiento. Conexi´ on a gestores de bases de datos. Eclipse es un IDE orientado al desarrollo de proyectos con tecnolog´ıa Java, aunque no es el u ´nico lenguaje de programaci´on al que da soporte. Eclipse es una herramienta de software libre, mantenido por la Eclipse Foundation.

1.3.1.

Principales caracter´ısticas del entorno de desarrollo Eclipse

Eclipse re´ une todas las caracter´ısticas comunes a los modernos IDE enumeradas m´ as arriba. Adem´ as posee un sistema de plug-ins con los que se pueden a˜ nadir nuevas funcionalidades. Por ejemplo, mediante un plug-in nos podemos conectar al sistema de control de versiones Subversion

1.3.2.

Descarga e instalaci´ on de Eclipse

Eclipse se puede descargar desde el sitio web http://www.eclipse.org. Existen versiones para las principales plataformas y sistemas operativos. Una particularidad de Eclipse es que no necesita instalaci´on. Una vez descargado el fichero comprimido, lo u ´nico que debemos hacer para empezar a utilizarlo es descomprimirlo en alg´ un directorio y seguidamente ejecutar el binario correspondiente a nuestra plataforma. La Figura 1.1 muestra la p´agina de inicio de Eclipse. Los iconos que muestra esta pantalla son enlaces a sitios de informaci´ on sobre Eclipse. La pantalla de inicio se puede cerrar pulsando el aspa que se encuentra a la derecha de la leyenda Welcome.

1.3.3.

Configurando el aspecto de Eclipse: Perspectivas y Vistas

El interface gr´ afico de usuario de Eclipse cuenta con dos conceptos fundamentales: las Perspectivas y las Vistas. Una Perspectiva es un contenedor de Vistas. En una misma Perspectiva podemos agrupar m´ as de una Vista. Las Vistas por su lado, son componentes visual que pueden mostrar desde un editor de c´ odigo, hasta un ´arbol de jerarqu´ıa de clases en Java. En la figura 1.2 se muestra el aspecto de Eclipse al mostrar la Perspectiva por defecto orientada al desarrollo de aplicaciones Java. Esta perspectiva contiene varias vistas, por ejemplo la vista Package Explorer donde se muestra informaci´on de la configuraci´on de nuestros proyectos. La vista Problems muestra un listado con los errores y avisos presentes en el c´odigo de nuestro proyecto. Cada una de estas vistas est´a orientada a presentar un tipo de informaci´ on de nuestro proyecto o tareas relacionadas con ´el. El aspecto de las perspectivas se puede configurar. Te habr´as dado cuenta que cada una de estas vistas est´a etiquetada con un nombre dentro de una solapa, si haces click sobre una de estas solapas sin soltar el bot´on del rat´on, puedes trasladar la vista a cualquier otra posici´on dentro de la perspectiva. Esto te permite organizar las vistas dentro de las perspectivas seg´ un tus preferencias. Existe una gran cantidad de vistas, puedes acceder a cualquiera de ellas a trav´es de la opci´ on Show view del men´ u Window.

1.3. EL ENTORNO DE DESARROLLO INTEGRADO ECLIPSE

17

Figura 1.1: Pantalla inicial de Eclipse

Figura 1.2: Perspectiva inicial orientada al desarrollo de proyectos Java2 SE.

´ CAP´ITULO 1. INTRODUCCION

18

Figura 1.3: Ventana para la creaci´on de un proyecto Java utilizando Eclipse.

Figura 1.4: Estructura m´ınima de un proyecto en Eclipse.

1.3.4.

El primer ejemplo

Vamos a crear un primer proyecto Java con Eclipse. Para ello, simplemente haz click con el bot´ on derecho en la vista Package Explorer, y sobre el men´ u emergente que aparecer´ a selecciona New → Project, se abrir´a una ventana como la mostrada en la Figura 1.3. En esta ventana lo u ´nico que vamos a introducir es el nombre del proyecto. Una vez introducido el nombre del proyecto, pulsa el bot´on Finish, ver´as que el aspecto de Eclipse se actualiza para mostrar el nuevo proyecto reci´en creado. En la vista Package Explorer aparecer´a el nombre del nuevo proyecto reci´en creado. La vista de proyecto sigue una estructura de ´arbol, que puedes desplegar, el resultado se muestra en la Figura 1.4 El siguiente paso que vamos a dar es crear una nueva clase en nuestro proyecto. Esta clase va a ser muy sencilla, y u ´nicamente nos va a servir para conocer cual es el procedimiento de creaci´on, edici´on, compilaci´on y ejecuci´on utilizando Eclipse. Para crear una nueva clase, haz click con el bot´on derecho del rat´on sobre el nombre del proyecto reci´en creado, se abrir´a un men´ u emergente, selecciona la opci´ on New → Class, presta atenci´on al icono que se dibuja a la izquierda de esta opci´ on, y ver´as que ese mismo icono la encuentras en la barrar de herramientas en la parte superior de la ventana de Eclipse. Otro procedimiento, m´ as r´ apido, de crear una nueva clase en Eclipse es pulsar directamente

1.3. EL ENTORNO DE DESARROLLO INTEGRADO ECLIPSE

19

Figura 1.5: Creaci´ on de una nueva clase Java en Eclipse. ese icono en la barra de herramientas. Al seleccionar esta opci´ on, se abrir´a la nueva ventana mostrada en la Figura 1.5. En esta ventana vamos a introducir tres piezas de informaci´on: Un nombre de paquete en min´ usculas (en el Cap´ıtulo 3 conocer´as con detalle el significado de los paquetes en Java. Un nombre de clase con la primera letra de cada palabra en may´ usculas y sin espacios entre ellas. Selecciona la opci´ on public static void main(String[] args) Esta tres piezas de informaci´ on aparecen en la Figura 1.5. Recuerda introducir el nombre del paquete y de la clase utilizando may´ usculas y min´ usculas tal y como se muestra en la Figura 1.5, en el Cap´ıtulo 2 conoceremos algunas de estas convenciones de codificaci´ on Java. Finalmente pulsa el bot´on Finish. Ver´ as que de nuevo se actualiza la estructura del proyecto, ahora podr´as ver que se ha creado, bajo el nodo del ´ arbol src un nuevo nodo con nombre hola y bajo ´el el nodo HolaMundo.java. Adem´ as, se ha abierto una nueva vista del editor de c´ odigo tal y como muestra la Figura 1.6. Hagamos una peque˜ na modificaci´on sobre este c´odigo. A˜ nade la siguiente l´ınea tal y como se muestra en la Figura 1.7. Esta instrucci´on sirve para mostrar una cadena de texto por consola. Una vez escrita la nueva l´ınea de c´odigo graba el fichero, para ello pulsa la combinaci´ on de teclas Ctrl + S. El siguiente paso va a ser ejecutar el programa, para ello haz click con el bot´ on derecho del rat´on sobre el editor de c´odigo y en el men´ u emergente que aparecer´a selecciona la opci´on Run As → Java Application.

20

´ CAP´ITULO 1. INTRODUCCION

Figura 1.6: Aspecto del editor de c´odigo Java.

Figura 1.7: El primer programa en Java Hola mundo.

1.4. HERRAMIENTAS DE DESARROLLO

21

Figura 1.8: Resultado de le ejecuci´ on del primer programa en Java Hola mundo. En la vista Console podr´ as ver el resultado de la ejecuci´on del programa, tal y como muestra la Figura 1.8 Por defecto, cada vez que haces modificaciones en el c´odigo de definici´on de una clase y grabas el fichero, Eclipse compila autom´aticamente el c´odigo modificado. De este modo la compilaci´on se realiza de modo transparente a medida que vamos trabajando en nuestro proyecto. Con estos sencillos pasos hemos creado nuestro primer proyecto en Java, y una u ´nica clase en la que hemos introducido una l´ınea de c´odigo que muestra un mensaje de texto por consola. El trabajo con Eclipse es realmente sencillo.

1.4.

Herramientas de desarrollo

Cuando nos planteamos desarrollar un proyecto inform´atico ser´a de gran ayuda elegir una serie de herramientas que nos faciliten actividades tales como el control de versiones de nuestro c´ odigo o la prueba autom´atica de nuestros m´etodos. En el estado actual de madurez de las tecnolog´ıas de desarrollo de proyectos inform´ aticos, resulta impensable iniciar el desarrollo de un proyecto sin planificar el control de versiones, la gesti´ on y seguimiento de errores, las herramientas de despliegue de la aplicaci´ on, y un largo etc´etera. Afortunadamente, en la actualidad, contamos con excelentes herramientas de software libre que cubren este tipo de tareas. E incluso, en algunos casos, existe m´ as de una soluci´ on de software libre, con lo que podemos evaluar varias de ellas y seleccionar la que mejor se adapte a nuestra forma de trabajar antes de empezar a utilizar. En este libro vamos a presentar algunas de estar herramientas. Las hemos elegido porque, a trav´es de nuestra propia experiencia, nos han parecido las m´as adecuadas a nuestro caso, pero como lector no debes seguir ciegamente nuestra elecci´ on. Mejor a´ un, t´ omala como punto de partida que le permita evaluar otras alternativas. La r´ apida evoluci´ on de la tecnolog´ıa inform´atica permite vaticinar que seguir´ an apareciendo cada vez m´as y mejores alternativas. En particular vamos a presentar las siguientes herramientas: Subvesion Es una herramienta para la gesti´on de versiones. JUnit Es un framework de pruebas autom´aticas de c´odigo. Ant Es una herramienta de construcci´on de proyectos. MyLyn Es una herramienta de gesti´on de tareas. Bugzilla Es una herramienta de gesti´on y seguimiento de errores. Cada una de las anteriores herramientas cuentan con una gran popularidad dentro de la comunidad de desarrollo de proyectos inform´aticos. Todas ellas

´ CAP´ITULO 1. INTRODUCCION

22

cuentan con otras excelentes alternativas. Todas ellas se pueden utilizar en proyectos que utilicen un lenguaje de programaci´on alternativo a Java, o existen versiones de ellas para otros lenguajes de programaci´on.

1.4.1.

A˜ nadiendo nueva funcionalidad a Eclipse: los plugins

Afortunadamente, desde Eclipse se puede interaccionar con todas las herramientas expuestas en la secci´on anterior. Eclipse cuenta con un sistema de plug-ins de tal modo que podemos aumentar sus ya de por s´ı numerosas y potentes funcionalidades con otras nuevas. As´ı, por ejemplo, podemos instalar un plug-in de Eclipse para poder realizar el control de versiones de nuestro c´odigo sin necesidad de abandonar Eclipse. En el Cap´ıtulo 4 se mostrar´ a c´omo instalar el plug-in para Eclipse y c´omo trabajar con ´el.

Lecturas recomendadas Un escueto resumen sobre lo que significa el lenguaje de programaci´on Java se puede encontrar en [11]. Una referencia completa sobre el entorno de desarrollo Eclipse se puede encontrar en la p´ agina web http://www.eclipse.org.

Cap´ıtulo 2

Clases en Java Contenidos 2.1. Definici´ on de una clase . . . . . . . . . . . . . . . . 2.2. Miembros de una clase . . . . . . . . . . . . . . . . 2.2.1. Atributos de una clase . . . . . . . . . . . . . . . . . 2.2.2. M´etodos de una clase. . . . . . . . . . . . . . . . . . 2.2.3. Constructores. . . . . . . . . . . . . . . . . . . . . . 2.2.4. Sobrecarga de m´etodos y constructores . . . . . . . . 2.3. Tipos de datos en Java. . . . . . . . . . . . . . . . . 2.3.1. Arrays de datos en Java. . . . . . . . . . . . . . . . . 2.4. Estructuras de control. . . . . . . . . . . . . . . . . 2.4.1. Estructuras de control de repetici´ on. . . . . . . . . . 2.4.1.1. El bucle for . . . . . . . . . . . . . . . . . 2.4.1.2. El bucle while . . . . . . . . . . . . . . . . 2.4.1.3. El bucle do...while . . . . . . . . . . . . . 2.4.2. Estructuras de control de selecci´ on. . . . . . . . . . . 2.4.2.1. Bifurcaciones con la sentencia if...else. . 2.4.2.2. M´ ultiples caminos con la sentencia switch 2.5. Modificadores de acceso. . . . . . . . . . . . . . . . 2.6. Modificadores static y final. . . . . . . . . . . . . 2.7. El recolector de basura. . . . . . . . . . . . . . . . . 2.8. Finalizaci´ on. . . . . . . . . . . . . . . . . . . . . . . 2.9. Comentarios. Comentarios de documentaci´ on. . .

24 25 25 26 28 32 33 34 36 37 37 38 38 39 39 39 40 42 43 44 45

Introducci´ on Las clases son la piedra angular de los lenguaje de programaci´on orientados a objetos (POO). Las clases son abstracciones de entidades de la realidad que sirven como plantillas para la creaci´ on de ejemplares de la clase. A estos ejemplares en POO se les llama objetos o instancias de la clase. El proceso de abstracci´on depende del contexto en el que se utilizar´an los ejemplares, es decir, no es lo mismo abstraer la entidad del mundo real ((Persona)) para utilizarla en una aplicaci´on 23

CAP´ITULO 2. CLASES

24

de gesti´ on de los clientes de una cl´ınica, que para utilizarla en una aplicaci´on de seguros o de banca. En general, las caracter´ısticas de la entidad real que nos interese utilizar en la aplicaci´on y las operaciones que podamos realizar sobre estas abstracciones ser´ an diferentes. Java es un lenguaje de programaci´on orientado a objetos, y aunque como veremos posee tipos b´ asicos para poder manejar enteros o caracteres, todo en Java es un objeto. De hecho en Java existen dos grandes tipos de datos: tipos de datos primitivos y tipos de datos referencia. En este cap´ıtulo vamos a ver c´omo, a partir de una abstracci´on, podemos transcribirla a c´ odigo Java para crear una clase, y c´omo a partir de una clase podemos crear instancias de esa clase. Finalmente avanzaremos la idea de reutilizaci´on de una clase. En POO la reutilizaci´ on implica escribir una nueva clase sin partir de cero, sino tomando como base otra clase cuyo comportamiento ampliamos o modificamos. Los detalles de c´ omo ampliar o extender el comportamiento de una clase base se introducir´ an en el Cap´ıtulo 3.

2.1.

Definici´ on de una clase

Supongamos que queremos programar una aplicaci´on de agenda telef´onica. El objetivo de nuestra agenda telef´onica es gestionar una serie de contactos. Cada uno de estos contactos representa a una Persona. Dicho de otro modo cada uno de los contactos de la agenda est´a creado a partir de la misma plantilla Persona, que es la abstracci´on de una persona del mundo real en el contexto de la aplicaci´ on de la agenda telef´onica. ¿Qu´e necesitamos especificar para crear un objeto o ejemplar de la clase Persona? Cada uno de los objetos creados a partir de esta clase contendr´a una serie de valores que lo identifican, como el nombre y los apellidos del contacto y su n´ umero de tel´efono. El conjunto de todos los valores de un objeto va a determinar su estado en un momento concreto. Por otro lado, sobre cada uno de los objetos vamos a poder llevar a cabo un conjunto de operaciones definidas en la clase. Volviendo al ejemplo de la agenda telef´onica, cada una de las ((Persona)) de la agenda va a tener una serie de datos de inter´es, que pueden o no variar a lo largo del tiempo (un contacto de mi agenda puede cambiar de n´ umero de tel´efono, pero no es probable que cambie de apellidos), y me va a ofrecer una serie de operaciones que puedo realizar sobre ella, como por ejemplo consultar su nombre.

Definici´ on Al conjunto de valores definidos en la clase se le llama atributos de la clase. Al conjunto de operaciones que define una clase se le llama m´etodos de la clase. Cuando hablamos de miembros de una clase hacemos referencia tanto a los atributos como a los m´etodos de la clase. La definici´ on de una clase en Java empieza con la palabra reservada class, y el conjunto de atributos y m´etodos de la clase se define en un bloque delimitado por llaves, del siguiente modo

2.2. MIEMBROS DE UNA CLASE

1 2 3 4

25

c l a s s Persona { // D e c l a r a c i ´ o n de a t r i b u t o s // D e f i n i c i ´ o n de m´ e todos }

2.2. 2.2.1.

Miembros de una clase Atributos de una clase

Ahora que ya sabemos que debemos abstraer una ((Persona)) del mundo real en el contexto de nuestra aplicaci´ on la siguiente pregunta es: ¿Cuales son las caracter´ısticas, o datos, de una persona relevantes en el contexto de una agenda telef´ onica? Sin duda uno de estos datos es el n´ umero de tel´efono de la persona; cada contacto de mi agenda tiene, de manera simplificada, un n´ umero de tel´efono. ¿Qu´e otros datos pueden ser de inter´es almacenar en una agenda telef´ onica?, parece evidente que, al menos, el nombre y los apellidos de cada uno de los contactos. Representemos gr´ aficamente lo que tenemos hasta ahora   Persona posee: →Nombre; →Apellidos; →Tel´efono;   ¿C´ omo se definen estos atributos en la clase? De cada uno de los atributos debemos especificar su tipo, por ejemplo, en el caso del Nombre, utilizaremos una cadena de caracteres; en el caso del Telefono podemos optar entre representarlo como un n´ umero entero o una cadena de caracteres; si queremos almacenar los n´ umeros de tel´efono en formato internacional (Ej: (+34) 555 555 555) optaremos por representarlos como cadenas de caracteres. Los atributos los declararemos de este modo: 1 2 3 4 5 6

c l a s s Persona { S t r i n g nombre ; String apellidos ; String telefono ; // D e f i n i c i ´ o n de m´ e todos }

F´ıjate que, al escribir el nombre de la clase hemos empezado la palabra por una letra may´ uscula, y que al empezar el nombre de un atributo lo hemos empezado por min´ uscula. Esta es una convenci´on de codificaci´on en Java que conviene seguir puesto que est´ a ampliamente extendida entre los desarrolladores Java. Veremos m´ as reglas de convenci´on en la Secci´on 2.9. F´ıjate tambi´en que hemos definido cada atributo en un l´ınea distinta y que cada l´ınea acaba con el caracter ;.

CAP´ITULO 2. CLASES

26 Reglas de convenci´ on

Seg´ un las reglas de convenci´on m´as extendidas en Java, al definir una clase, el nombre de la clase se debe escribir con la primera letra en may´ uscula y los nombres de los atributos y m´etodos deben empezar por una letra en min´ uscula. Si estos nombres est´ an formados por m´as de una palabra, la segunda y siguientes palabras que constituyen el nombre se escriben con su primera letra en may´ uscula. Por ejemplo: numeroTelefono. Veamos ahora c´ omo definir las operaciones que podremos realizar sobre las instancias de la clase Persona.

2.2.2.

M´ etodos de una clase.

Una vez hemos creado una instancia de la clase Persona, ¿C´omo podemos recuperar a partir de ella su nombre?, ¿C´omo podemos recuperar el nombre que almacenamos en un contacto de nuestra agenda?. Una posibilidad es simplemente leer el valor del atributo, pero como veremos en la secci´ on 2.5 el acceso directo a los atributos de una clase est´a desaconsejado. La respuesta es: a trav´es de una llamada a un m´etodo que devuelva el nombre del contacto. En el caso de la recuperaci´on del nombre, el tipo de dato de retorno es una cadena class String. Un m´etodo que cumple este objetivo es el siguiente: 1 2 3

String getPersona () { return nombre ; }

Sintaxis La sintaxis de declaraci´on de un m´etodo es: {modificadores} tipoRetorno nombre(tipo argumento1, tipo argumento2, ...) { Bloque de definici´on del m´etodo; } En estas pocas l´ıneas de c´odigo hay varias novedades, ve´amoslas: 1. Un m´etodo tiene un nombre que lo identifica, en este caso getNombre. 2. Delante del nombre del m´etodo escribimos el tipo del valor de retorno, en nuestro caso, como lo que el m´etodo devuelve es el nombre cuyo tipo es un String, este ser´a el tipo del valor retorno. 3. Detr´ as del nombre del m´etodo aparecen unos par´entesis sin nada en su interior. Dentro de los par´entesis se define la lista de argumentos del m´etodo. Si est´ as familiarizado con las matem´aticas, los argumentos de los m´etodos tienen el mismo significado que los argumentos de las funciones matem´aticas, por ejemplo seno(45o ) significa que queremos utilizar el c´alculo del seno sobre el argumento 45 grados. En nuestro caso la lista est´a vac´ıa, lo que indica que no necesito especificar ning´ un argumento para poder hacer uso del m´etodo.

2.2. MIEMBROS DE UNA CLASE

27

4. La definici´ on del m´etodo va dentro de las llaves . 5. Para devolver un valor utilizamos la palabra reservada return. Como ves, muchos conceptos nuevos en tan s´olo tres l´ıneas de c´odigo. Y una nueva convenci´ on de codificaci´ on, si un m´etodo devuelve el valor de un atributo empieza por la palabra inglesa get, de ah´ı que hayamos escrito getNombre(). Con lo que ya hemos visto, es sencillo escribir dos nuevos m´etodo que devuelvan los apellidos y el n´ umero de tel´efono de una Persona. Aqu´ı tienes el c´ odigo de la clase: 1 2 3 4

c l a s s Persona { S t r i n g nombre ; String apellidos ; String telefono ;

5

String getPersona () { return nombre ; }

6 7 8 9

String getApellidos () { return a p e l l i d o s ; }

10 11 12 13

String getTelefono () { return t e l e f o n o ; }

14 15 16 17

}

Listado 2.1: C´ odigo de la clase Persona De nuevo, f´ıjate que si un m´etodo no recibe argumentos su lista de argumentos est´ a vac´ıa. Pero si un m´etodo no devuelve ning´ un par´ametro, hay que indicarlo expl´ıcitamente utilizando la palabra reservada void. Por ejemplo, el siguiente m´etodo no devuelve ning´ un valor: 1 2 3

void nada ( ) { // C´ o digo d e l m´ e todo }

En muchas ocasiones resulta interesante poder modificar el valor de los atributos. Como ya hemos comentado anteriormente, un contacto de mi agenda podr´ıa cambiar de n´ umero de tel´efono, luego parece buena idea que la clase Persona me proporcione un m´etodo que permita modificar el valor del atributo telefono, como el que se muestra en el siguiente ejemplo: 1 2 3

void s e t T e l e f o n o ( S t r i n g n u e v o T e l e f o n o ) { t e l e f o n o = nuevoTelefono ; }

Listado 2.2: M´etodo para modificar el valor del tel´efono. De nuevo, hemos seguido una convenci´on de codificaci´on: Regla de convenci´ on Los m´etodos que modifican el valor de los atributos de una clase se nombran empezando con la palabra inglesa set seguida por el nombre del atributo, cuya primera letra se escribe en may´ usculas.

CAP´ITULO 2. CLASES

28

De modo an´ alogo, podemos a˜ nadir a la clase Persona dos nuevos m´etodos para poder modificar el valor de los atributos nombre y apellidos, tal y como se muestra a continuaci´ on: 1 2 3

void setNombre ( S t r i n g nuevoNombre ) { nombre = nuevoNombre ; }

4 5 6 7

void s e t A p e l l i d o s ( S t r i n g n u e v o s A p e l l i d o s ) { apellidos = nuevosApellidos ; }

Listado 2.3: M´etodos para modificar el nombre y los apellidos de una Persona Ya tenemos escritos m´etodos que nos permiten leer y modificar los atributos de la clase Persona. Ahora queremos crear ejemplares de esta clase, para ello necesitamos escribir m´etodos especiales que nos sirvan para crear instancias de la clase, a estos m´etodos especiales se les llama constructores de la clase.

2.2.3.

Constructores.

Para crear un ejemplar de una clase utilizamos m´etodos especiales llamados constructores de la clase. En las siguientes l´ıneas de c´odigo se muestra c´omo se define un constructor de la clase Persona: 1 2 3 4 5

P e r s o n a ( S t r i n g nombre , S t r i n g a p e l l i d o s , t h i s . nombre = nombre ; this . a p e l l i d o s = a p e l l i d o s ; this . t e l e f o n o = t e l e f o n o ; }

String

telefono ) {

Listado 2.4: Constructor con par´ametros de la clase Persona Volvemos a tener nuevos conceptos en estas l´ıneas de c´odigo, ve´amoslo: 1. Un constructor es un m´etodo cuyo nombre coincide con el de la clase, en nuestro caso el nombre del m´etodo es Persona que es precisamente el nombre de la clase. 2. Como cualquier otro m´etodo, tiene un lista de argumentos que en este caso no est´ a vac´ıa, si no que indica que va a recibir tres argumentos y los tres de tipo String. 3. F´ıjate que los nombres de los tres argumentos coinciden con los nombres de los atributos; la clase tiene declarado un atributo de tipo String llamado nombre y el primer argumento del constructor tambi´en se llama nombre y es de tipo String. ¿C´omo resolvemos la ambig¨ uedad entre el nombre del atributo y el nombre del argumento?, utilizando la palabra reservada this; si escribimos this.nombre estamos haciendo referencia al atributo, si s´ olo escribimos nombre, estamos haciendo referencia al argumento del m´etodo. Veremos con m´as detalle el significado de la palabra reservada this en la secci´ on 2.3. 4. Un constructor no devuelve ning´ un valor de retorno, ya que estos m´etodos especiales nos sirven para crear objetos.

2.2. MIEMBROS DE UNA CLASE

29

Escribamos otro constructor para la clase Persona: 1

Persona ( ) { }

M´ as novedades conceptuales en estas l´ıneas de c´odigo: 1. La lista de argumentos de este constructor est´a vac´ıa. 2. No hemos escrito ninguna l´ınea de c´odigo entre las llaves. A este constructor tan particular se le llama Constructor por defecto y hablaremos m´ as sobre ´el en el cap´ıtulo 3 dedicado a la herencia en Java. De momento qu´edate con la idea de que es importante que tus clases definan el constructor por defecto, de hecho, todas tus clases deber´ıan definirlo. Si tu clase no proporciona ning´ un constructor, como en el caso del Listado 2.5, el compilador de Java crea el constructor por defecto para la clase, de modo que puedas crear instancias a partir de ella. 1 2

class SinConstructores { private i n t a ;

3

i n t getA ( ) { return a ; }

4 5 6 7

}

Listado 2.5: Una clase sin ning´ un constructor. El compilador de Java crear´a el constructor por defecto por nosotros. Veamos todo el c´ odigo que hemos escrito para la clase Persona: 1

package agenda ;

2 3 4 5 6

public c l a s s P e r s o n a { S t r i n g nombre ; String apellidos ; String telefono ;

7

Persona ( ) { }

8 9

P e r s o n a ( S t r i n g nombre , S t r i n g a p e l l i d o s , t h i s . nombre = nombre ; this . a p e l l i d o s = a p e l l i d o s ; this . t e l e f o n o = t e l e f o n o ; }

10 11 12 13 14

String

telefono ) {

15

S t r i n g getNombre ( ) { return nombre ; }

16 17 18 19

String getApellidos () { return a p e l l i d o s ; }

20 21 22 23

String getTelefono () { return t e l e f o n o ; }

24 25 26 27

}

Listado 2.6: C´ odigo de la clase Persona En el Listado 2.6 hemos agrupado los m´etodos get/set para cada uno de los atributos, adem´ as hemos modificado la definici´on de los m´etodos set para

CAP´ITULO 2. CLASES

30

deshacer la ambig¨ uedad entre el nombre de los atributos y de los argumentos, tal y como hemos hecho en el caso del constructor con argumentos. Antes de pasar adelante, escribamos nuestra primera peque˜ na aplicaci´on en Java para probar todo lo que hemos visto hasta ahora. Vamos a utilizar para ello el entorno integrado de desarrollo Eclipse, inicia pues esta aplicaci´on. Hay varias opciones para crear un nuevo proyecto en Eclipse, a trav´es del men´ u puedes elegir File → New → Java Project, o bien puedes pulsar el bot´on de creaci´on de proyectos. Eclipse te solicitar´a un nombre para el proyecto, introduce uno adecuado (por ejemplo ((AgendaTelefonica))), y ya puedes pulsar directamente la tecla Finish. Ver´ as que en la columna izquierda de Eclipse, donde se muestra la vista Package Explorer te aparece una carpeta con el mismo nombre que el proyecto reci´en creado. Eclipse organiza los proyectos en carpetas, el c´odigo de tu proyecto, ficheros de bibliotecas y recursos necesarios estar´an en la carpeta del proyecto. Para crear un nueva clase en Eclipse puedes hacerlo a trav´es del men´ u File → New → Class, o bien pulsando directamente el bot´on de creaci´on de una nueva clase. Se abrir´ a una ventana de di´alogo solicit´andote un nombre para la nueva clase y el paquete donde se incluir´a. Es muy recomendable que cada clase est´e dentro de un paquete (veremos con m´as detalle el significado de los paquetes en Java en la Secci´on 3.6). Seg´ un las convenciones de Java, los nombres de paquetes se escriben en min´ uscula. Escribe, por ejemplo, para el nombre del paquete agenda, y para el nombre de la clase Persona. Ver´as que se abre la vista del editor de c´ odigo en Eclipse y que si despliegas la carpeta de proyecto te aparece el fichero de clase Persona.java. Escribe la definici´on de la clase seg´ un el Listado 2.6. Lo siguiente que vamos a hacer es escribir una clase para probar nuestra clase Persona, para ello crea en el proyecto una nueva clase y ll´amala PruebaPersona y como nombre de paquete introduce agenda, y en el cuadro de di´alogo de creaci´ on de la clase marca la casilla public static void main(String[] args), con ello Eclipse crear´ a de manera autom´atica el m´etodo principal main. Escribe el resto de c´ odigo que aparece en el Listado 2.7. 1

package agenda ;

2 3

public c l a s s PruebaPersona {

4

/∗ ∗ ∗ @param a r g s ∗/ public s t a t i c void main ( S t r i n g [ ] a r g s ) { // TODO Auto−g e n e r a t e d method s t u b P e r s o n a unaPersona = new P e r s o n a ( " ´ Oscar " , " Belmonte " , " 1234 " ) ; System . o u t . p r i n t l n ( " M u e s t r a i n f o r m a c i ´ on accediendo directamente a los campos ." ) ; System . o u t . p r i n t l n ( " N o m b r e : " + unaPersona . nombre ) ; System . o u t . p r i n t l n ( " A p e l l i d o s : " + unaPersona . a p e l l i d o s ) ; System . o u t . p r i n t l n ( " T e l e ´ f o n o : " + unaPersona . t e l e f o n o ) ;

5 6 7 8 9 10 11 12 13 14 15

System . o u t . p r i n t l n ( " M u e s t r a i n f o r m a c i ´ on llamando a los m´ e t o d o s de la clase ." ) ; System . o u t . p r i n t l n ( " N o m b r e : " + unaPersona . getNombre ( ) ) ; System . o u t . p r i n t l n ( " A p e l l i d o s : " + unaPersona . g e t A p e l l i d o s ( ) ) ; System . o u t . p r i n t l n ( " T e l e ´ f o n o : " + unaPersona . g e t T e l e f o n o ( ) ) ;

16 17 18 19

}

20 21 22

}

2.2. MIEMBROS DE UNA CLASE

31

Listado 2.7: C´ odigo de la clase Principal La clase Principal est´ a repleta de novedades. Esta clase tiene un u ´nico m´etodo public static void main(String[] args), este m´etodo es el punto de entrada a la ejecuci´ on de un programa Java. En las siguientes secciones veremos el significado de todos los modificadores que tiene este m´etodo delante de su nombre que es main. En la l´ınea n´ umero 10, vemos c´omo se usa el operador new para crear una instancia de la clase, escribimos tras new un constructor de la clase, en este caso Persona("´ Oscar", "Belmonte", "1234"),new utilizar´a el constructor con tres argumentos de la clase Persona para crear una nueva instancia. F´ıjate que a la izquierda de new tenemos Persona unaPersona =, esto indica que nos guardamos lo que el operador new devuelve en la variable de tipo referencia a Persona que llamamos unaPersona, en las siguientes secciones veremos con m´ as detalle qu´e significa el concepto variable de tipo referencia, de momento la idea es que, para poder usar la instancia a la Persona reci´en creada utilizaremos la variable de referencia unaPersona.

Reglas de convenci´ on Los nombre de los paquetes y subpaquetes se escriben en min´ usculas. En las l´ıneas 12-14 recuperamos la informaci´on a partir de la variable de tipo referencia a Persona accediendo directamente a sus atributos (nombre, apellidos, telefono); mientras que en las l´ıneas 17-19 accedemos a la misma informaci´ on haciendo uso de los m´etodos definidos en la clase (getNombre(), getApellidos(), getTelefono()). Finalmente, para mostrar informaci´on en forma de texto por consola utilizamos System.out.println("Texto"). Ejecutemos este primer programa para ver cual es el resultado, para ello haz click con el bot´ on derecho sobre el nombre de la clase Principal.java que tienes en la columna de la derecha en Eclipse (Package Explorer ) y en el men´ u emergente que te aparecer´a selecciona Run as → Java Application; en la parte inferior de Eclipse se abrir´a una nueva solapa (Console) donde se mostrar´ a el resultado de la ejecuci´ on que debe ser: Muestra informaci´ on accediendo directamente a los campos. Nombre: ´ Oscar Apellidos:Belmonte Tel´ efono: 1234 Muestra informaci´ on llamando a los m´ etodos de la clase. Nombre: ´ Oscar Apellidos:Belmonte Tel´ efono: 1234 Como has comprobado, el trabajo de edici´on en Eclipse es realmente sencillo y te ir´ as dando cuenta que este entorno de programaci´on Java es muy potente.

CAP´ITULO 2. CLASES

32

Pregunta En el ejemplo anterior estamos recuperando la informaci´on almacenada en una instancia de la clase Persona de dos modos: accediendo directamente a sus atributos, o llamando a los m´etodos de la clase. ¿Qu´e sentido tiene declarar m´etodos de acceso a los atributos de una clase si puedo acceder directamente a ellos?.

2.2.4.

Sobrecarga de m´ etodos y constructores

Dos o m´ as m´etodos pueden tener el mismo nombre siempre que su n´ umero de argumentos sea distinto. En caso de que los dos m´etodos tengan el mismo n´ umero de argumentos, ser´an distintos si al menos un tipo de sus argumentos es distinto. Por ejemplo en el siguiente Listado los dos m´etodos unMetodo est´an sobrecargados y son distintos. 1 2 3

p u b l i c v o i d unMetodo ( i n t e n t e r o ) { // D e f i n i c i ´ o n d e l m´ e todo }

4 5 6 7

p u b l i c v o i d unMetodo ( f l o a t r e a l ) { // D e f i n i c i ´ o n d e l m´ e todo }

De modo an´ alogo, los constructores tambi´en pueden estar sobrecargados, de hecho hemos sobrecargado el constructor de la clase Persona en el Listado 2.6, esta clase tiene dos constructores Persona() y Persona(String nombre, String apellidos, String telefono). Un detalle muy importante en la sobrecarga de m´etodos es que el tipo de retorno no sirve para distinguir dos m´etodos. Si dos m´etodos tienen el mismo n´ umero de argumentos y sus tipos son los mismos, no los podremos sobrecargar haciendo que el tipo de sus valores de retorno sean distintos. Definici´ on El nombre de un m´etodo junto con su lista de argumentos forman la signatura del m´etodo. El tipo del valor de retorno no forma parte de la signatura de un m´etodo. En el siguiente Listado se muestra un error al intentar sobrecargar dos m´etodos que se distinguen u ´nicamente por su tipo de retorno. 1 2 3 4 5

// ESTE LISTADO CONTIENE UN ERROR. ´ // LOS METODOS NO SE PUEDEN SOBRECARGAR POR EL TIPO DE RETORNO. p u b l i c v o i d unMetodo ( ) { // D e f i n i c i ´ o n d e l m´ e todo }

6 7 8 9

p u b l i c i n t unMetodo ( ) { // D e f i n i c i ´ o n d e l m´ e todo }

Los dos m´etodos tienen el mismo nombre y ning´ un argumento, el primero de ellos no retorna nada void, y el segundo de ellos retorna un int. El compilador es

2.3. TIPOS DE DATOS EN JAVA. Tipo boolean char byte short int long float double

Tama˜ no(bits) 1 16 8 16 32 64 32 64

33

Definici´ on true o false Car´ acter Unicode Entero en complemento a dos con signo Entero en complemento a dos con signo Entero en complemento a dos con signo Entero en complemento a dos con signo Real en punto flotante seg´ un la norma IEEE 754 Real en punto flotante seg´ un la norma IEEE 754

Tabla 2.1: Tipos de datos primitivos en Java y sus tama˜ nos en memoria.

incapaz de distinguirlos y devuelve un error que indica que estamos intentando definir el mismo m´etodo dos veces. Pero volvamos a Java y vemos qu´e significa el t´ermino tipo de dato referencia.

2.3.

Tipos de datos en Java.

En Java existen dos grandes grupos de tipos de datos, los tipos de datos primitivos y los tipos de datos referencia. Los tipos de datos primitivos sirven para representar tipos de datos tales como n´ umeros enteros, caracteres, n´ umeros reales, booleanos, etc´etera. Se les llama primitivos porque nos permiten manejar elementos de informaci´on b´asicos como letras y n´ umeros. Una variable de tipo primitivo nos permite almacenar en ella un tipo primitivo como por ejemplo un valor num´erico. Por otro lado, los tipos de datos referencia nos permiten indicar que vamos a trabajar con instancias de clases, no con tipos primitivos. Una variable de tipo referencia establece una conexi´ on hacia un objeto, y a trav´es de esta conexi´on podremos acceder a sus atributos y m´etodos. Cuando hablamos de variables, es muy importante asimilar la diferencia entre variables de tipo primitivo y variables de tipo referencia. En una variable de tipo primitivo podemos almacenar valores de tipo primitivo (n´ umeros, caracteres); pero el las variables de tipo referencia no almacenamos valores son la puerta de entrada hacia los objetos. Son los objetos, las instancias de clases, las que almacenan informaci´ on y me permiten trabajar con ellos a trav´es de llamadas a sus m´etodos.

Concepto Las variables de tipo primitivo nos permiten almacenar valores de tipo primitivo como n´ umeros y caracteres. Las variables de tipo referencia no almacenan valores, sino que nos permiten acceder a los atributos y m´etodos de los objetos. En Java, el tama˜ no en memoria de los tipos de datos primitivos est´a estandarizado. Los tipos de datos primitivos y sus tama˜ nos son los que aparecen en la Tabla 2.1.

CAP´ITULO 2. CLASES

34

Sintaxis Las variables de tipo primitivo se declaran de este modo: tipo nombre [ = valor inicial]; Ejemplo 1 : int hojas; Ejemplo 2 : float pi = 3.14f; //f´ ıjate en la f al final del n´ umero Como ya hemos visto, las referencias en Java son la puerta de entrada a los objetos, las referencias me permiten acceder a los atributos y m´etodos de los objetos, el tipo de una referencia debe ser compatible con el tipo del objeto al que se refiere. En el cap´ıtulo 3 dedicado a la herencia veremos qu´e quiere decir ((compatible)). Sintaxis Las variables de tipo referencia se declaran de este modo: tipoReferencia nombre [ = valor referencia inicial]; Ejemplo 1 : Persona persona; Ejemplo 2 : Persona persona = new Persona("´ Oscar", "P´ erez", "123"); En m´ ultiples ocasiones, nos interesa trabajar con m´as de un u ´nico valor de un determinado tipo, en vez de trabajar con una u ´nica Persona queremos trabajar con un grupo de personas. Veamos c´omo podemos declarar conjuntos de elementos del mismo tipo en Java.

2.3.1.

Arrays de datos en Java.

Hasta el momento, hemos aprendido c´omo declarar variables de tipos de datos primitivos y de tipos de datos referencia. Esto nos sirve para crear una u ´nica variable que contendr´ a bien un tipo de datos primitivo a una referencia a un objeto, pero a veces nos interesa poder manejar conjuntos de elementos del mismo tipo, por ejemplo, en alguna circunstancia nos puede interesar declarar una variable con la que poder acceder a un grupo de 10 enteros o 100 objetos de la clase Persona. En Java utilizaremos arrays de elementos cuando necesitemos manejar m´as de un elemento del mismo tipo. Para declarar un array en Java utilizamos los corchetes seg´ un la siguiente sintaxis: Sintaxis Los arrays de tipos primitivos se declaran: Ejemplo 1 : int array[]; // Array declarado Ejemplo 2 : int arrayEnteros[] = new int[10]; // Array iniciado Los arrays de tipos referencia se declaran: Ejemplo 3 : Persona grupo[]; // Array declarado Ejemplo 4 : Persona grupo = new Persona[10]; // Array iniciado Aunque la sintaxis de la declaraci´on de arrays de tipo primitivo y de tipo referencia es la misma, el resultado es radicalmente distinto en los dos casos.

2.3. TIPOS DE DATOS EN JAVA.

35

Analic´emoslo. En el Ejemplo 2 del recuadro de sintaxis anterior se est´a definiendo un array capaz de albergar 10 enteros (con ´ındice 0 para el primer elemento e ´ındice 9 para el u ´ltimo), dentro de cada una de las posiciones del array podemos almacenar un entero. En el caso del Ejemplo 4, estamos definiendo un array capaz de albergar 10 ((referencias)) de tipo Persona. En este caso, lo que tenemos en cada una de las posiciones del array no es un objeto de tipo Persona, si no una referencia a un objeto de tipo Persona. Dicho de otro modo No se ha creado ning´ un objeto de la clase Persona, s´ olo referencias a objetos de ese tipo. La diferencia entre arrays de tipo primitivo y tipo referencia es muy importante. Mientras que en el caso de los arrays de tipo primitivo, una vez creados ya tenemos disponible en cada una de sus posiciones espacio para albergar un elemento del tipo correspondiente, en los arrays de tipo referencia no se ha creado ninguna instancia de la clase correspondiente, lo u ´nico que se ha creado es un conjunto de referencias que podremos conectar a objetos de la clase correspondiente, y estos objetos los habremos creado en otro lugar de nuestro programa. Veamos esta diferencia con el siguiente ejemplo 1

package agenda ;

2 3

public c l a s s A r r a y s {

4

/∗ ∗ ∗ @param a r g s ∗/ public s t a t i c void main ( S t r i n g [ ] a r g s ) { // TODO Auto−g e n e r a t e d method s t u b i n t a r r a y E n t e r o s [ ] = new i n t [ 1 0 ] ; P e r s o n a g r u p o P e r s o n a s [ ] = new P e r s o n a [ 1 0 ] ; // La s i g u i e n t e s e n t e n c i a e s v a l i d a System . o u t . p r i n t l n ( " V a l o r e n a r r a y E n t e r o s [ 5 ] : " + a r r a y E n t e r o s [ 5 ] ) ; // Se p r o d u c e un e r r o r , no hay nada en l a p o s i c i ´ on [5] System . o u t . p r i n t l n ( " N o m b r e e n p o s i c i ´ on grupoPersonas [5]: " + g r u p o P e r s o n a s [ 5 ] . nombre ) ;

5 6 7 8 9 10 11 12 13 14 15 16

}

17 18 19

}

Listado 2.8: Diferencia entre arrays de tipos primitivos y arrays de tipos referencia Si creas una nueva clase con el c´ odigo del Listado 2.8 y lo ejecutas (recuerda: bot´ on derecho sobre el nombre de la clase en el Package Explorer, y luego Run as → Java Applications), obtendr´ as el siguiente error: Valor en arrayEnteros[5]: 0 Exception in thread "main" java.lang.NullPointerException at hola.Arrays.main(Arrays.java:15) En la posici´ on 5 del array de enteros tenemos un valor por defecto, pero la referencia que tenemos en la posici´ on 5 del array de tipo Persona es el valor por defecto null que en Java tiene el significado de Referencia no asignada.

CAP´ITULO 2. CLASES

36 Sintaxis

A los elementos de un array se accede mediante el operador []. Dentro de este operador indicamos la posici´on del elemento a la que deseamos acceder. ¿C´ omo podemos resolver el error anterior?. Simplemente asignando a la referencia en la posici´ on 5 del array grupoPersonas una referencia a un objeto que haya sido creado: 1

package agenda ;

2 3

public c l a s s A r r a y s 2 {

4

/∗ ∗ ∗ @param a r g s ∗/ public s t a t i c void main ( S t r i n g [ ] a r g s ) { // TODO Auto−g e n e r a t e d method s t u b i n t a r r a y E n t e r o s [ ] = new i n t [ 1 0 ] ; P e r s o n a g r u p o P e r s o n a s [ ] = new P e r s o n a [ 1 0 ] ; g r u p o P e r s o n a s [ 5 ] = new P e r s o n a ( " J a m e s " , " G o s s l i n g " , " 5 5 5 1 2 3 4 5 6 " ) ; // La s i g u i e n t e s e n t e n c i a e s v a l i d a System . o u t . p r i n t l n ( " V a l o r e n a r r a y E n t e r o s [ 5 ] : " + a r r a y E n t e r o s [ 5 ] ) ; // Se p r o d u c e un e r r o r , no hay nada en l a p o s i c i ´ on [5] System . o u t . p r i n t l n ( " N o m b r e e n p o s i c i ´ on grupoPersonas [5]: " + g r u p o P e r s o n a s [ 5 ] . nombre ) ;

5 6 7 8 9 10 11 12 13 14 15 16 17

}

18 19 20

}

Si ejecutas el c´ odigo con la modificaci´on obtendr´as el siguiente resultado: Valor en arrayEnteros[5]: 0 Nombre en posici´ on grupoPersonas[5]: James En este u ´ltimo caso la referencia en la posici´on 5 del array grupoPersonas s´ı que hace referencia a un objeto, luego no hay problema al usarla para acceder a su atributo nombre. Ya sabemos c´ omo acceder a los elementos de un array, la pregunta que nos surge es ¿C´ omo puedo recorrer todos los elementos de un array?. La respuesta es: ((Usando estructuras de control de repetici´on))

2.4.

Estructuras de control.

Java es un lenguaje de programaci´on estructurado, esto significa que Java proporciona estructuras de control para decidir el flujo de ejecuci´on de nuestros programas. Existen dos grandes grupos de estructuras de control: Estructuras de control de repetici´ on: Nos permiten indicar si un determinado bloque de c´ odigo se debe ejecutar mas de una vez. Estructuras de control de selecci´ on: Nos permiten especificar mas de una direcci´ on de flujo dependiendo de alguna condici´on.

2.4. ESTRUCTURAS DE CONTROL.

2.4.1.

37

Estructuras de control de repetici´ on.

En Java existen tres estructuras de control de repetici´on: Bucle for. Bucle while. Bucle do...while. Las estructuras de repetici´ on sirven para repetir una determinada tarea mientras se cumpla cierta condici´ on. En el caso de un array nos sirven para recorrer los elementos almacenados en el array secuencialmente, para, por ejemplo, mostrar sus valores. Veamos como se usa cada una de estas estructuras de repetici´ on. 2.4.1.1.

El bucle for

Si conocemos cual es el primer elementos y el u ´ltimo sobre los que queremos iterar el bucle for es la manera m´ as c´omoda de recorrerlos todos. Su sintaxis es la siguiente:

Sintaxis La sintaxis del bucle for es: for(inicio; condici´ on: incremento) Ejemplo 1: for(int i = 0; i