Documentos de Académico
Documentos de Profesional
Documentos de Cultura
com
Descargado en:www.pcprogramasymas.com
Programación Orientada a
Objetos con
“La novela”
pcprogramasymas.com
pcprogramasymas.com
Programación Orientada a
Objetos con
“La novela”
pcprogramasymas.com
Nuria Medina Medina
Ilustraciones:
José Abraham Serrano Martínez
Diseño de colección, cubierta Datos catalográficos
y pre-impresión: Grupo RC
Medina, Nuria
Programación Orientada a Objetos con JAVA. “La novela”
Primera Edición
Alfaomega Grupo Editor, S.A. de C.V., México
ISBN: 978-607-622-596-7
Formato: 15 x 21 cm Páginas: 216
Programación Orientada a Objetos con JAVA. “La novela”
Nuria Medina Medina
ISBN: 978-84-943450-5-0 edición original publicada por RC Libros, Madrid, España.
Derechos reservados © 2015 RC Libros
Primera edición: Alfaomega Grupo Editor, México, Febrero 2016
ISBN: 978-607-622-596-7
Derechos reservados:
Esta obra es propiedad intelectual de su autor y los derechos de publicación en lengua
pcprogramasymas.com
española han sido legalmente transferidos al editor. Prohibida su reproducción parcial o total
por cualquier medio sin permiso por escrito del propietario de los derechos del copyright.
Nota importante:
La información contenida en esta obra tiene un fin exclusivamente didáctico y, por lo tanto,
no está previsto su aprovechamiento a nivel profesional o industrial. Las indicaciones técnicas
y programas incluidos, han sido elaborados con gran cuidado por el autor y reproducidos bajo
estrictas normas de control. ALFAOMEGA GRUPO EDITOR, S.A. de C.V. no será
jurídicamente responsable por: errores u omisiones; daños y perjuicios que se pudieran
atribuir al uso de la información comprendida en este libro, ni por la utilización indebida que
pudiera dársele.
Edición autorizada para venta en México y todo el continente americano.
Impreso en México. Printed in Mexico.
Empresas del grupo:
México: Alfaomega Grupo Editor, S.A. de C.V. – Pitágoras 1139, Col. Del Valle, México, D.F. – C.P. 03100.
Tel.: (52-55) 5575-5022 – Fax: (52-55) 5575-2420 / 2490. Sin costo: 01-800-020-4396
E-mail: atencionalcliente@alfaomega.com.mx
Colombia: Alfaomega Colombiana S.A. – Calle 62 No. 20-46, Barrio San Luis, Bogotá, Colombia,
Tels.: (57-1) 746 0102 / 210 0415 – E-mail: cliente@alfaomega.com.co
Chile: Alfaomega Grupo Editor, S.A. – Av. Providencia 1443. Oficina 24, Santiago, Chile
Tel.: (56-2) 2235-4248 – Fax: (56-2) 2235-5786 – E-mail: agechile@alfaomega.cl
Argentina: Alfaomega Grupo Editor Argentino, S.A. – Paraguay 1307 P.B. Of. 11, C.P. 1057, Buenos Aires,
Argentina, – Tel./Fax: (54-11) 4811-0887 y 4811 7183 – E-mail: ventas@alfaomegaeditor.com.ar
Índice de capítulos
Prólogo......................................................................................... VII
Guía didáctica.............................................................................. XI
1. Duda existencial ...................................................................... 1
2. El señor Paradigma................................................................ 4
3. Los justos y necesarios ......................................................... 9
4. Cuestión de atributos ......................................................... 13
5. Responsabilidades .............................................................. 18
6. Viaje astral .............................................................................. 23
7. Mi forma de hacer las cosas ............................................ 27
8. Curiosidades .......................................................................... 31
9. Madre, matrona y alumbramiento ............................... 37
pcprogramasymas.com
10. Basura .................................................................................... 47
11. Ver mundo ........................................................................... 53
12. Helicóptero de viento...................................................... 62
13. Amor a primera vista ...................................................... 72
14. Detalles .................................................................................. 80
15. Sonríe y di “patata” .......................................................... 94
16. El método perdido......................................................... 102
17. Herencia............................................................................. 113
18. El árbol genealógico ..................................................... 129
19. Detenido por incumplimiento de contrato ......... 143
20. Vídeos polimórficos ...................................................... 153
21. Ligadura dinámica......................................................... 165
22. Reflexiones ....................................................................... 171
23. aDios .................................................................................... 182
Plantillas para escribir clases e interfaces en Java . 189
Índice de contenidos ............................................................ 199
V
pcprogramasymas.com
Prólogo
VII
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Reports).
Asimismo, ha dirigido varios proyectos, tanto de
innovación docente como de investigación, y en la actualidad
es investigadora principal de un proyecto de excelencia de la
Junta de Andalucía sobre videojuegos educativos.
Adicionalmente, en términos de gestión, ha sido y es
miembro de varias comisiones en el Departamento de
Lenguajes y Sistemas Informáticos (al que pertenece) y en la
Escuela Técnica Superior de Ingenierías Informática y de
Telecomunicación; ocupando también el cargo de secretaria
del Centro de Investigación en Tecnologías de la Información
y las Comunicaciones de la UGR. En cuanto a movilidad, ha
realizado varias estancias en la Universidad de Jaén y de
Sevilla, así como tres estancias de investigación
IX
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
A mis estudiantes, pasados, presentes y futuros; y a todos
los estudiantes de Java, por y para quienes este libro ha sido
concebido.
A mi editor, José Luis Ramírez, por creer en este proyecto.
X
Guía didáctica
pcprogramasymas.com
Aunque la sintaxis utilizada es la de Java, la semántica de
la mayoría de los conceptos (objetos, clases, interfaces, es-
tado e identidad, diseño basado en responsabilidades,
encapsulamiento, modularidad, herencia, ligadura, polimor-
fismo, reflexión…) puede ser aplicada con matices en otros
lenguajes orientados a objetos.
La novela puede ser explotada, a modo de complemento o
recurso único, tanto para adquirir como para afianzar
conocimientos sólidos de programación en Java. La
metodología de enseñanza es indiscutiblemente sencilla,
únicamente es necesario leer. No obstante, se recomienda
que se realice una lectura activa, que propicie y tome por
norma reflexionar y poner en práctica lo leído.
XI
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
encerrar, dentro de la narración, los textos que reproducen
de forma directa los pensamientos de los personajes.
Dicho esto, solo queda añadir: lee, disfruta y aprende.
XII
1. Duda existencial
pcprogramasymas.com
bastante espacio a mi alrededor; y con los “brazos” cruzados,
esperando vete a saber qué, mientras atisbo algunos otros
“cuerpos” por allá arriba y por allá abajo.
¿Paranoico? No tengo orejas, pero puedo oír tus
pensamientos. ¡Je, je!
¡No soy un paranoico!, es solo que estoy perdido. Bueno,
metafóricamente hablando, porque es difícil estar perdido
con una flecha apuntándome de forma perenne a la
“espalda”.
Ah... ahora he pasado de paranoico a loco, ¿me equivoco?
Pues debo aclararte que el puntero no es, en absoluto, un
producto de mi imaginación; la flecha está, ¡vaya que si está!
Veo la punta perfectamente; y también alcanzo a discernir el
otro extremo, procedente de la otra región.
2
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
3
2. El señor Paradigma
4
© Alfaomega - RC Libros JAVA. LA NOVELA
5
NURIA MEDINA © Alfaomega - RC Libros
7
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
1
Los objetos son el núcleo del paradigma de
programación orientado a objetos, no las clases (concepto
introducido en el capítulo 6). De hecho, existen
lenguajes de programación orientados a objetos que no
tienen clases, sino objetos prototipo
8
3. Los justos y necesarios
pcprogramasymas.com
intrigado respecto a quién es Juan y más convencido de que
preguntarlo sería inapropiado.
—Bueno, Juan, ¿querrás saber quién es Juan, verdad? —el
sinsentido rompe el silencio que se había instalado entre
ambos.
—Vaya... señor Paradigma, ¿puede leerme el pensamiento?
—Por supuesto, pero tampoco era necesario, los objetos
especiales siempre quieren saber a quién o a qué modelan.
—¿Modelar?
—Cada objeto modela un ente perceptible en el mundo
exterior.
9
NURIA MEDINA © Alfaomega - RC Libros
2
Un objeto puede ser un objeto cotidiano como una
impresora, pero también una pe
un conjunto, etc.
10
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
Java en la aplicación informática.
—¿Qué es una entidad bancaria?
—Olvídalo —se disculpa azorado el señor Paradigma—.
Esos conceptos están fuera de tu dominio de aplicación. Y,
aunque, paradójicamente, sabes qué es una isla o un yogur,
desconoces la mayoría de los objetos y lugares que quedan
fuera de tu dominio de aplicación. A todos los objetos
excepcionales les pasa, tranquilo.
—No, si estoy tranquilo, pero…, solo por concretar
—persevero para llegar al fondo de la cuestión—: ¿cuál es
mi dominio de aplicación?
3
Una cuenta de ahorro es otro ejemplo de objeto
conceptual
11
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
12
4. Cuestión de atributos
pcprogramasymas.com
Conozco mi nombre4 , apellidos, fecha de nacimiento5 , DNI,
número de hermanos 6 , asignaturas en las que estoy
matriculado, expediente… pero no conozco mi color favorito,
el nombre de mi mascota (si es que tengo algún perro o un
gato, o quizá un canario), ni mis hábitos diarios. Es una
4
String nombre = “Juan”; /* el atributo denominado
nombre está declarado de tipo String y contiene el valor
“Juan” que es una cadena de caracteres */
5
GregorianCalendar fechaNacimiento; /* el atributo
fecha de nacimiento está declarado de tipo
GregorianCalendar y en esta línea no contiene ningún
valor válido o lo que es lo mismo su valor actual es null
*/
6
int numeroHermanos = 2; /* el atributo número de
hermanos está declarado de tipo int y contiene el valor
entero 2 */
13
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—¡Menudo susto me ha dado! —reclamo al señor
Paradigma que acaba de irrumpir en la escena digital como
un elefante en una cacharrería.
—Lo siento, chico. Pero no pude evitar observarte
mientras analizabas tu estado.
—¿Observarme o espiarme? —refunfuño con descaro.
—No seas quisquilloso, el ser omnipresente es lo que trae
consigo. No puedo evitar estar al tanto de todo lo que ocurre
en el programa.
—Está bien, tendré que acostumbrarme. Por cierto,
cambiando de tema, ¿ha dicho que yo analizaba mi estado?,
¿estado?
14
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
notoriamente malhumorado y comienza a voltear su “cintura”
filosófica para darme la “espalda”.
—¡Alto!, que todavía tengo preguntas.
—Ajá… —resopla engreído—, dime.
—¿Mi estado puede cambiar? Es que juraría que primero
mi dirección era “C/Elvira, 7” y ahora es “C/Camino de
Ronda, 23”.
—Bien apuntado. Efectivamente, has hecho mudanza y
sin cargar un solo bulto —señala y se ríe—. Tu estado es
variable y, por tanto, el valor de algunos atributos puede
verse modificado a lo largo del tiempo.
¡Plaf!, se me viene a la “cabeza” mi estado de ánimo; ese,
claro está, no es significativo para el programa, pero es tela
15
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
constituir mi esencia, porque la esencia debe ser
imperturbable.
¡Qué lío! Estas meta-dudas son harto complicadas de
resolver porque cuando descifras un misterio nacen cientos.
Me recuerda a la pescadilla que se muerde la cola. Aunque:
¿qué es una pescadilla?, y, ¿una cola? Otra vez lo mismo,
quiero gritar: ¡que alguien me ayude! Pero entonces el señor
Paradigma reaparecería con su “bigote” de caballero
impecable y me pediría tiempo, con palabras sofisticadas
como transversal, y yo me callaría la “boca” y miraría al
suelo... Desearía que hubiese alguien más a quien recurrir.
Espera... eso es.
Oye, se me está ocurriendo que quizá tú podrías
ayudarme.
16
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
17
5. Responsabilidades
pcprogramasymas.com
—Responsabilidades, tareas que debes resolver. Tareas
en las que tú estás al mando.
—¿Yo solito? —discurro, con cierta zozobra.
—Si la tarea es compleja puedes pedir ayuda a otros
objetos —suspiro durante la pausa teatral que el señor
Paradigma imprime magistralmente—, pero la obligación de
que se realice correctamente es tuya —sentencia.
Me está tomando por un pusilánime, cree que voy a
amedrentarme ante mis responsabilidades. Yo no puedo leer
sus pensamientos, pero ya lo voy conociendo. No le daré el
gusto.
—Manos a la obra, entonces —exclamo, recién enfundado
en mi “traje” de ejecutivo—. Voy a llevar a cabo una de esas
18
© Alfaomega - RC Libros JAVA. LA NOVELA
19
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
dos objetos.
—Hablando se entiende la gente, ¿no?
—¿Qué quiere decir? ¿Que los objetos hablan?
—Tú no hablas, parloteas.
Vaya, como las suelta el señor Paradigma...
—En serio, explíquemelo, por favor.
—Cuando un objeto necesita que otro objeto realice una
tarea de la que es responsable, se lo pide enviándole un
mensaje. El objeto receptor del mensaje resuelve la tarea y
luego devuelve el control al objeto emisor.
—Me he liado con eso del objeto receptor y emisor.
20
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
solicita?, ¿no puede negarse?
—Siempre que la tarea esté entre sus responsabilidades
la realiza. Por ejemplo, se le puede pedir a un bombero que
apague un fuego, pero no se le puede pedir que baile la
danza del vientre.
—¿Cómo?
—Ni caso a mi último ejemplo. El tema es que los objetos
colaboran entre sí para alcanzar los objetivos de la
7
objetoReceptor.mensaje(argumento1,
pcprogramasymas.com
22
6. Viaje astral
pcprogramasymas.com
mi estancia: brillan más refulgentes que de costumbre. El
vaivén me resulta hipnótico y me dedico a contarlas. Al
principio son decenas, luego se le unen centenas, ahora
miles. ¿Qué está pasando?
La explosión de claridad me ciega. Cierro los “ojos”, pero
sigo viéndolas. Pizpiretas, comienzan a danzar ejecutando
una coreografía que culmina con la creación de una espiral
rutilante en la que yo soy el centro. La luz de la espiral
reverbera y crece sin cesar. La expansión parece no tener
límites, ni en altura ni en anchura; y así debe ser porque para
cuando se detiene, el radio del rizo es infinito.
Justo ahí empiezo a flotar y me desdoblo en dos entes,
unidos por un “cordón umbilical” de unos tres milímetros de
diámetro y apariencia de rayo. Mi yo de siempre se queda en
23
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
24
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
de opinión. Mejor, dígame: ¿cuál es el fichero .java de mi
clase? Porque yo tengo clase, ¿verdad?
—Sí, tienes clase y estilo, no hay más que verte —se
monda de risa y no sé de qué, pero se lo paso por alto—. Y,
también, tienes una clase. El fichero donde se almacena el
código Java de tu clase se llama como tu clase, pero con la
extensión .java.
—Señor Paradigma, no dé tantos rodeos que parece un
vaquero. ¿Cómo se llama el fichero de mi clase?
—EstudianteGradoInformatica.java
—Qué largo... —Me gusta mucho más Juan.
25
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
26
7. Mi forma de hacer las cosas
pcprogramasymas.com
—Anda, dime qué es un método para asegurarme de que
lo has entendido a pesar de haber desatendido tres cuartos
de mi explicación.
—Un método es el bloque de código que se ejecuta
cuando un objeto recibe un mensaje. Es la forma de resolver
la petición que nos hacen a través de un mensaje.
—¿Y?
—El método tiene dos partes —refrendo como un
papagayo—: cabecera y cuerpo. El cuerpo 8 es el bloque de
8
{sentencia1; sentencia2;...sentenciaN;} /* Cuerpo del
método. Ejemplo: {int r; r=x+y; return r;} es un cuerpo
con tres sentencias que son: una declaración, una
expresión y una devolución de valor */
27
NURIA MEDINA © Alfaomega - RC Libros
9
respuesta nombreMetodo(parametro1,
parametro2,...,parametroN) /* Cabecera del método.
Ejemplo: int suma(int x, int y) es una cabecera que
indica que el método, denominado suma, va a devolver un
valor de tipo int y va a necesitar como argumentos dos
valores enteros denominados x e y */
28
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
mordiéndome las “uñas” y con la “respiración” contenida,
ansioso por encontrarme con mis métodos; con mi manera
de hacer las cosas, de cumplir mis responsabilidades.
A cada paso me impaciento más, y para apaciguar mi
excitación me concentro en repetir mentalmente los
números de las líneas de código: 809, 810, 811... hasta que
finalmente el señor Paradigma exclama:
10
void nombreMetodo(parametro1,...,parametroM) /*
Cabecera del método. Ejemplo: void
saludaPorPantalla(String saludo) es un método que imprime
en pantalla la cadena de texto almacenada en el objeto
saludo, pero no devuelve ningún valor */
objetoReceptor.nombreMetodo(argumento1,...,argumentoM);
/* Envío de mensaje que no devuelve nada. Ejemplo:
unaVar.saludaPorPantalla(“hola”); */
29
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
30
8. Curiosidades
31
NURIA MEDINA © Alfaomega - RC Libros
32
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
Las líneas de código se suceden con una simetría casi
perfecta. Llaves que cierran y abren bloques, y los punto y
coma que finalizan sentencias. Paso de puntillas para no
molestar, pero de vez en cuando acaricio un void en la
cabecera de un método y abrazo a un return en el cuerpo de
otro. El maestro me contó que los métodos que devuelven un
valor lo hacen siempre con una sentencia de retorno 11. «No
11
return valor_respuesta /* Ejemplo:
int suma(int x, int y){
int r;
r = x+y;
return r;//Devuelve la suma de los dos argumentos
}
int res = unaVar.suma(3,4); Devolvería como respuesta
el valor 7 que se almacena en la variable res */
33
NURIA MEDINA © Alfaomega - RC Libros
12
static respuesta nombreMetodoClase(parametro1,
parametro2,..., parametroN)
13
EstudianteGradoInformatica.nombreMetodoClase(argumento1,.
.., argumentoN) /* Ejemplo:
EstudianteGradoInformatica.incrementaNumeroEstudiantesG
I(); */
34
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
pronuncie las mismas palabras.
—Está bien —accede—. Dije que “un método static
requiere para ejecutarse que se le envíe un mensaje a tu
clase, no a ti ni a ninguno de los otros objetos de tu clase”.
—¡Eso es! —me arranco ahora con unos pasillos de
salsa—. Ha dicho que hay otras instancias de mi misma
clase—. Agarro al señor Paradigma y le doy un par de
vueltas y un beso en la “frente”. Él se suelta y me aparta con
un gesto desagradable. No me achico por el desplante, la
verdad es que no lleva el ritmo en la sangre.
—Me voy hasta que se te pase la euforia —notifica muy
dignamente.
35
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
36
9. Madre, matrona y alumbramiento
pcprogramasymas.com
—¡Alto ahí! —Me desgañito—. Tiene que contarme bien
eso de que hay otros objetos de mi misma clase.
El maestro emprende un mohín de resignación y deshace
su marcha para plantarse frente a mí con los “brazos” en
jarra.
—Pregunta —ofrece generoso.
—¿Cuántos hermanos tengo?
—¿Hermanos?, ¿a qué viene eso? —Menuda “cara” de
espanto.
—Si la clase es mi mamá y hay otros hijos suyos, tengo
hermanos —razono.
37
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—¿Quién, qué? —suena a trabalenguas.
—¿Quién me ha creado?
—Digamos que el intérprete de Java —concluye y se ríe
para eliminar tensión.
—¿Qué? —replico sorprendido ante la introducción
inesperada de un nuevo concepto.
—El intérprete es una implementación de la Máquina
Virtual de Java. Antes de que me lo preguntes, te diré que la
Máquina Virtual de Java es el entorno donde se ejecuta el
programa Java. El mundo del que venimos, ¿recuerdas?
—Me estoy perdiendo. ¿Qué tiene que ver eso con mi
nacimiento?
38
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
Ahí me percato de que el constructor es ligeramente
diferente a los demás métodos de mi clase, y lo que más me
llama la atención es que se llama exactamente como mi
clase: EstudianteGradoInformatica. Luego, reparo en que no
devuelve nada, ni un valor, ni siquiera void. Qué raro...
—Señor Paradigma, ¿cómo es posible que no devuelva
nada?
15
unaVar = new
EstudianteGradoInformatica(argumento1,..., argumentoN);
/* Ejemplo: EstudianteGradoInformatica var; var = new
EstudianteGradoInformatica(“Juan”,...,“C/Elvira, 7”); */
40
© Alfaomega - RC Libros JAVA. LA NOVELA
41
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Puede seguir llamándome Juan. Y, por favor, aguante
esa prisa que le ha entrado de repente. Déjeme hacerle
algunas consultas más.
—Adelante —consiente de mala gana.
—¿Puede haber varios métodos constructores en una
misma clase?
—Sí, siempre que tengan distintos argumentos, claro está.
—Y... ¿pueden construirse dos objetos con el mismo
constructor y con el mismo valor en todos sus argumentos?
—Sí, claro.
—¿Seguro, señor Paradigma?
42
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
pensamiento—... Lo siento, no puedo evitarlo —se
disculpa—. ¿Quieres que veamos algo más en el código
fuente de tu clase o nos vamos de una vez?
44
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
pcprogramasymas.com
Sería una verdadera lástima desaprovecharlo. Por eso he
decidido contártelo a ti que, por otro lado, seguramente
serás mucho menos testarudo que el señor Paradigma. Ahí
va: «La clase es mi madre porque define desde antes de mi
nacimiento cómo voy a ser: qué cosas puedo hacer y cómo
(métodos) y qué atributos me van a describir a lo largo de mi
vida (variables para configurar mi estado). Además, la clase
define el constructor, que codifica el alumbramiento del
nuevo objeto. Y, ¿el intérprete?, ¿dónde queda el intérprete
de la Máquina Virtual? Para mí es más que evidente, el
intérprete es la matrona que asiste a mamá durante el parto,
indoloro, a Dios gracias».
¿A que llevo razón?
Ni se te ocurra discutirme... menos, ahora, justo antes del
despeeeeeeeeeeeeeeeeeeeeeeegue.
46
10. Basura
pcprogramasymas.com
—Durante los viajes astrales el tiempo se congela
—explica el señor Paradigma que reaparece fresco como una
rosa nofrost—. Debe ser así porque, en otro caso, algún otro
objeto podría haberte enviado un mensaje y tú no habrías
estado preparado para responder a su petición.
—Sí, por supuesto, el principio de colaboración entre
objetos —arguyo, a la par que me desprendo de una
“legaña”—. ¡Siempre dispuestos a cumplir con nuestras
responsabilidades! —exclamo, mientras alzo el “brazo”,
aprieto el “puño” y me estiro con energías renovadas y
desmedida grandilocuencia.
—Intuyo que estás encantado de ser un objeto.
47
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Morirás cuando ya nadie te necesite.
—Gracias por ser tan preciso —resuelvo irónico.
—De nada —responde con sorna. Ahora sí le apetece
jugar...
—Vale, no me diga cuándo; así podré vivir sin esa presión.
—Resoplo—. Pero, dígame al menos: ¿quién es la señora
muerte?
—Mira que suenas pedante cuando te lo propones. No hay
señora muerte, se trata simplemente de la Máquina Virtual
de Java y su recolector de basura automático. —Me mira por
encima del “hombro” mientras añade—: el recolector de
basura pasa cada cierto tiempo y libera el espacio de
memoria ocupado por objetos a los que ya ninguna flecha
49
NURIA MEDINA © Alfaomega - RC Libros
50
© Alfaomega - RC Libros JAVA. LA NOVELA
51
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Deme su palabra de que no me regañará.
—Claro que no. ¿Por qué iba a hacerlo? Dime, ¿qué tienes
en mente?
—Es tan solo por asegurarme —aclaro y lanzo la
cuestión—: ¿no podría estudiar para ser compilador?
—¡No! —grita antes de que acabe, y me deja en la duda de
si escuchó mi pensamiento o mi contestación.
—No se ponga así, tenía que intentarlo —remato y, para
devolvérsela, comienzo a manosearme los “dedos” de los
“pies” con ímpetu. Y ¡qué se atreva a decirme algo!: si los
objetos no tenemos pies, ¿cómo íbamos a tener pelotillas de
basura entre los “dedos”?
52
11. Ver mundo
pcprogramasymas.com
he dejado de pensar en EstudianteGradoInformatica desde
que la conocí; al igual que no he dejado de contemplarme el
“ombligo”. Por eso, te puedo decir qué dimensiones tiene, los
pliegues que se forman en el fondo, el color del borde y,
gracias a la flexibilidad que concede la no materia, te puedo
concretar inclusive su sabor.
¿Dulce o salado?
No te lo cuento. ¡Ya está bien! Voy a dejar de lamerme el
“ombligo”, de todo se cansa uno. Además, el señor
Paradigma tenía razón, un objeto solitario no sirve de nada.
Voy a explorar mundo, a mirar arriba, abajo y alrededor; a
concebirme como una pieza del puzle infinito.
Adiós “ombligo”. Fue dulce mientras duró.
—¿Señor Paradigma?
53
NURIA MEDINA © Alfaomega - RC Libros
—¿Señor Paradigma?
—¡Señor Paradigma!, ¿dónde está?
—Buenas chico. ¡Cuánto tiempo! —aparece sonriente.
—Sí, he estado ocupado —apunto, mientras aparto la
vista de mi “ombligo” (es difícil eliminar el hábito).
—¿Te ha llegado algún mensaje?
Madre mía, ¡qué gordo se ha puesto! Mientras yo me
velaba el “ombligo”, él se llenaba la “panza”. Sonrío y
respondo despreocupado:
—No, no, ninguna petición.
—¿Entonces? —pregunta con sorna.
—He tenido otros menesteres entre manos.
pcprogramasymas.com
—Ya, ya —susurra, revelando que me ha estado
espiando—. Dime, ¿qué quieres?, ¿por qué me llamabas con
tanta insistencia?
—Quiero comprender este mundo.
—Un propósito demasiado ambicioso, ¿no crees?
—Bueno, quizá no vaya a saberlo todo; pero cuénteme
algunas cosas sobre él.
—Está bien. ¿Por dónde empiezo?
—¿Por qué tuvimos que hacer un viaje astral para llegar
hasta mi clase? —llevo tiempo dándole vueltas.
—Buena pregunta… A ver cómo te lo explico.
54
© Alfaomega - RC Libros JAVA. LA NOVELA
16
last in, first out
56
© Alfaomega - RC Libros JAVA. LA NOVELA
17
int, char, boolean, float, long, short, byte, double
/* valores de estos tipos primitivos son: 45, ‘a’, true,
1234.5, etc. */
57
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
hay varias variables del programa que referencian dicho
objeto.
—¿Variables?
—Sí, variables; se llaman así porque pueden cambiar su
valor a lo largo del tiempo y todas se almacenan en el stack.
El valor de una variable18 puede ser un dato primitivo,
pongamos 3, o puede ser un puntero a un objeto, digamos tú.
Las variables deben ser previamente declaradas 19 según el
tipo de objetos o de valores primitivos que van a almacenar.
18
var1 = 3;
var2 = new EstudianteGradoInformatica(...);
19
int var1;
EstudianteGradoInformatica var2;
58
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
20
En los métodos Java los parámetros siempre se pasan
por valor (copia), Así, cuando se trata de un objeto se
copia el puntero y dentro del método se trabaja con el
propio objeto argumento (no con uno igual, como ocurre
con los valores primitivos donde se copia el valor). Lo
mismo ocurre con la asignación de variables
59
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Ilustración 6. El valor de una variable que apunta a un objeto es
la dirección de memoria donde está almacenado dicho objeto en el
heap. Si una variable (declarada de una clase) no apunta a ningún
objeto tendrá valor null. Si un objeto no es apuntado por ninguna
variable será removido por el recolector de basura.
pcprogramasymas.com
61
12. Helicóptero de viento
pcprogramasymas.com
cerrados, no estoy disfrutando la experiencia. Maldito
zumbido. Al menos, el señor Paradigma está a mi vera,
agarrado del otro alerón, supongo, porque no puedo verlo.
Cuento hasta veinte, me imagino un lago en calma, tarareo
letrillas ligeras de verbenas populares, incluso, al compás,
agito mis “extremidades inferiores” con garbo y mucho
cuidado de no soltarme, pero no me relajo. Qué va. Me
duelen los “párpados” de mantenerlos apretados. Creo que
voy a acabar con rozaduras en las “pupilas”. No aguanto más.
Tengo que hacer algo:
—Señor Paradigma, tengo miedo —afirmo.
—Qué tontería dices, muchacho.
—No es ninguna tontería, usted no sabe la impresión que
supone volar en helicóptero a ciegas.
62
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Por eso no quería que miraras —predica—. En
cualquier caso, no te preocupes, ya estamos llegando.
—¿Ya?, ¿vamos a aterrizar?
—¿Acaso has visto alguna vez un ventilador aterrizando?,
¿qué cosas tienes? —Se coloca la “mano” libre en jarra y
respira profundamente para soltar como si nada—: cuando
yo diga tres, ¡salta!
—¡Está usted loco!
—¡Los dos estamos locos!, ¿por qué si no íbamos a estar
agarrados al ventilador de la CPU? Anda, hazme caso, cierra
los “ojos” y salta.
Justo cuando voy a replicar, me doy cuenta de que no
podrá escucharme porque: ¡ya ha saltado!
63
NURIA MEDINA © Alfaomega - RC Libros
—¡Jerónimooooooooooooooooooooooooooooooo! —grito
mientras caigo en peso muerto tras él.
Por fortuna, el descenso de nuestros “cuerpos” se ejecuta
a cámara lenta; concesión que me permite abrir los “ojos”.
Primero un poco, luego del todo. Entonces, oteo el horizonte,
sin gravedad, ni palabras. El paisaje es espectacular.
A mano derecha, el montículo21 se divisa como si fuese el
suelo desnudo de un desierto. Debido a la distancia, no me es
posible identificar ni mi casa ni los otros objetos que se
hospedan en el heap; pero sí que puedo admirar el color
uniforme y cálido que conforman los objetos cuando se
reducen todos a una única mancha. A la izquierda, bajo mis
pies, se encuentra la pila 22, columna infinita que se irgue
altiva hasta coronar el cielo de bits. En mitad, un océano de
flechas que enlazan las dos regiones. La telaraña que une los
dos mundos, de donde vengo y adónde voy.
pcprogramasymas.com
Como una pluma que se mece en la vertical, continúa mi
descenso, hasta que, sin apenas darme cuenta, ruedo sobre
el señor Paradigma que me sirve de colchón y agradezco los
“cúmulos de grasa” que se le forman donde otros tienen
cintura.
Me sacudo y me incorporo. Acabamos de aterrizar en una
celda del stack que almacena el número 0x0000812C.
—Querido “Juan”, te presento a “var”.
21
heap
22
stack
64
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
acabar la frase con bizarría.
—Vaya, creía que lo habrías olvidado.
—Qué va —revelo, agitando la “mano” con desdén—,
tengo muy buena memoria, para lo que quiero.
El señor Paradigma asiente ausente, sigue inmerso en su
planchado manual. Mientras, yo me siento al lado de mi
puntero y, silente, reflexiono sobre la importancia de esa
celda.
23
var = new EstudianteGradoInformatica(“Juan”,...); /*
La variable var (almacenada en el stack) guarda la
posición de memoria (en el heap) del objeto que se acaba
de crear: 0x0000812C */
65
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Cuando se libera el espacio en memoria de un objeto, su
estado se desglosa en sus atributos y cada atributo se
descompone en átomos de vacío; y esos átomos de vacío se
dividen en partículas subatómicas que luego se esparcen
como ceniza antes de centrifugarse en proyectos pasados y
futuros.
—No he entendido nada —declaro muy serio.
—Te resumo. Los objetos cuando mueren se transforman
en pensamientos, justo lo mismo que sois antes de nacer.
24
var = 3; // o
var=new EstudianteGradoInformatica(“Pedro”,...); //o
var=otraVariable;
66
pcprogramasymas.com
—Ja, ja, esto parece el “cuento de pan y pimiento”.
—¿Qué cuento es ese?
—No perdamos el tiempo en bucles infinitos —le exijo—.
Dígame cuándo dos objetos son iguales, pero no idénticos.
—Dos objetos son iguales cuando son de la misma clase y
tienen el mismo estado, o sea, igual valor en todos sus
25
var1 == var2 //Ejemplo: 3 == 3 es true
/* Ejemplo: Circulo var1, var2; var1=new Circulo(3);
var2=var1; var1==var2 es true */
26
var1.equals(var2)/* Ejemplo: Circulo var1, var2;
var1=new Circulo(3); var2=new Circulo(3);
var1.equal(var2) es true, pero var1==var2 es false */
67
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
27
ArrayList, LinkedList, TreeSet, HasMap... son
colecciones típicas en Java
69
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Ilustración 7. Los atributos de un objeto pueden ser, a su vez,
otros objetos. Así, la mayoría de los objetos son estructuralmente
complejos.
pcprogramasymas.com
71
13. Amor a primera vista
pcprogramasymas.com
siquiera se inmutó por el hecho de que estuviese asido a un
aspa de ventilador. Le puse “ojitos” y no reaccionó, agité el
“brazo” y ni caso; tampoco tuve mejor suerte cuando le grité:
«¡vaya cosita linda!». Más bien tuve mala suerte, porque el
maestro se rio a carcajadas. Menudo ataque de risa. Nunca lo
había visto así. Pero no lo critico, la situación era ridícula.
Rio hasta toser y luego me explicó que no podía verme,
que ella no era un objeto especial. Quise saber por qué yo
tampoco podía verla y le exigí una explicación. Entiendo que
esto puede parecer un sinsentido ya que acabo de decir que
la vi, pero es que aunque la veía y sabía que era una
estudiante como yo, era como si estuviese envuelta en una
cápsula opaca que, a partir de ahí, no me dejaba conocer ni
tan siquiera su nombre.
72
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Sí, en vuestra clase existe un método consultor28 para
conocer el valor de cada atributo de los que conforman tu
estado.
—Espere un momento. Ella y yo pertenecemos a la misma
clase. Eso significa...
—Eso no significa nada, ella no es tu hermana porque tu
clase no es tu mamá. Ya te lo aclaré; la clase es una definición
textual, no es un elemento vivo en Java.
—¿Cómo sabe lo que estaba pensando? —recapacité a
tiempo y no le di opción a contestar. En su lugar, tramé mi
venganza—: no me responda, había olvidado que puede
28
getNombre(), getDireccion(), getFechaNacimiento()...
73
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Usted gana —acepté—. Dígame, ¿cómo se llama el
método que tiene mi clase para consultar la fecha de
nacimiento de una de sus instancias? Quiero preguntarle
también la edad porque, tendré que confesárselo, me gustan
las chicas mayores y, si vamos a compartir “fluidos
eléctricos”, quiero asegurarme de que no sea una pipiola.
—Vuestro amor es imposible.
—¿Por qué iba a serlo? —rebato con tono de fastidio.
—Porque se sale de los requisitos funcionales de la
aplicación.
—Venga, recuérdeme de todos modos cómo se llamaban
esos métodos —insisto con prisa—. Cuando estuvimos en mi
código fuente no me fijé en los consultores y quiero
aprender —apelo a su deber docente.
74
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
atributo cuyo valor se quiere consultar.
—Y getNombre() para saber cómo se llama. Lo tengo todo,
gracias.
Me quedo callado y un silencio incómodo se aposta entre
ambos. La ausencia de sonidos revolotea sobre nuestras
“cabezas” sin hacer ruido. El señor Paradigma se impacienta,
desconfía, pero no se atreve a volver a insistirme ni puede
exigirme que siga haciéndole preguntas. Así que espera un
rato y luego desaparece como niebla temprana.
Me quedo solo, y me repito que el maestro tiene toda la
razón: el amor no es para los objetos, es para los humanos
que se dedican a cambiar de sitio las montañas. Sin embargo,
mi “patata caliente” palpita cuando recuerdo su imagen, la
de la chica (no la del profe, claro está).
75
NURIA MEDINA © Alfaomega - RC Libros
29
chica.getNombre();
30
chica.getFechaNacimiento();
76
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
Isidora, se llama Isidora y tiene 22 años.
¿Isidora? No me gusta el nombre. Y hago una barbaridad.
Más por intuición que por conocimiento, más por
atrevimiento que por necesidad, respiro hondo, saco “pecho”
y digo en alto: chica.setNombre(“Helena”).
—¡Estás loco de remate! —clama el señor Paradigma que
surge de la nada, desbaratando la escena con unas tijeras de
podar—. No te das cuenta de lo que tratabas de hacer.
¿Cambiarle el valor de un atributo a otro objeto del
programa? Estás demente, si no llego a intervenir a tiempo
habría aceptado tu mensaje.
—Perdón —expreso trémulo.
77
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
del método, respectivamente.
—No me entero.
—Si me prometes que dejarás en paz, de una vez por
todas, a Isidora, te lo explico.
—Prometido, si le digo la verdad ya no me gusta tanto; y
si una piedra pesa lo suyo, imagínese una montaña...
—¡Cómo sois los jóvenes! En cuanto se pierde el misterio
se esfuma el interés.
31
chica.setNombre(“Helena”); /* Los métodos que
modifican atributos se suelen denominar con la palabra
set (u otra similar) seguida del nombre del atributo cuyo
valor establecen o actualizan */
78
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
79
14. Detalles
pcprogramasymas.com
—Ya estamos aquí de nuevo. En el código fuente de tu
clase. Fíjate bien, ahora, en todos los detalles —me suelta
con tintes de amonestación.
—Sí, lo haré, maestro. La otra vez admiré el cuadro grosso
modo, vista de águila que se llama, pero empiezo a darme
cuenta de que los detalles son importantes.
—Por supuesto que lo son. En la implementación de una
clase cada detalle cuenta. Observa el atributo nombre 32. ¿Lo
ves? Lo primero que pone es private; eso significa que es un
atributo privado. Es decir, que solo se puede acceder
directamente a su valor desde el código de los métodos de
32
private String nombre;
80
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Chico, si lo has hecho tú mismo hace un momento.
Tienes vista de águila, pero memoria de pez. Si otro objeto,
digamos por caso, un objeto de la clase Profesor, quiere
averiguar tu nombre, usará el método consultor
correspondiente34.
33
nombre = “valor”; //Ejemplo: nombre = “Juanitín”; o
nombre = otroString; //Ejemplo: nombre = otroNombre; o
return nombre; //o
String otraVar = nombre; /* ninguna de estas
instrucciones está permitida fuera de la clase
EstudianteGradoInformatica porque el atributo nombre es
privado */
34
String n = var.getNombre(); /* var apunta al
estudiante llamado “Juan” */
81
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—... ¿y si no tengo ganas de decirle al profesor mi
nombre?
—Te jodes —Dios mío, el señor Paradigma ha soltado un
taco, me deja estupefacto—. Es tu responsabilidad y tienes
que ejecutarla. Así funciona todo, ¿recuerdas?: colaboración
entre objetos.
—Tranquilo, maestro. No se ponga así. Lo dije medio en
broma.
—Ya, ya... medio en broma, medio en serio —porfía con
retintín.
Trago saliva y lo observo. No sé si le ha molestado más mi
actitud rebelde o que quisiera echar por tierra el principio
fundamental de la orientación a objetos. Pero es
82
© Alfaomega - RC Libros JAVA. LA NOVELA
35
public GregorianCalendar getFechaNacimiento(){
int year = fechaNacimiento.get(Calendar.YEAR);
int month = fechaNacimiento.get(Calendar.MONTH);
GregorianCalendar nF = new
GregorianCalendar(year,month,day);
return nF;
}
83
NURIA MEDINA © Alfaomega - RC Libros
36
public void setFechaNacimiento(GregorianCalendar
nuevaFecha) {fechaNacimiento = new
GregorianCalendar( nuevaFecha.get(Calendar.YEAR),
nuevaFecha.get(Calendar.MONTH),
nuevaFecha.get(Calendar.DAY_OF_MONTH));}
37
public float getPeso() {return peso;}
public void setPeso(float nuevoPeso) {peso =
nuevoPeso;}
84
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
atributo de un objeto 38. De modo que el conjunto de
variables de instancia guarda el estado de un objeto que,
como recordarás, solía cambiar a lo largo de la vida del
mismo.
—Sí, lo recuerdo —afirmo, observando las líneas de
código donde se han declarado mis atributos y una
progresión de sensaciones acontece: surgen como unas
38
class EstudianteGradoInformatica{
private String nombre; //variable de instancia
private GregorianCalendar fechaNacimiento;
//v.instancia
... /* declaración del resto de variables de
instancia */
// declaración de los métodos
}
85
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Estás acelerado. Cálmate, pisa el freno y dime:
¿recuerdas qué significaba que un método estuviese
declarado como static?
—Creo que sí —confieso y respiro antes de tirarme a la
piscina—: un método static es una responsabilidad que
resuelve la clase y por lo tanto requiere que el mensaje (la
petición) se le envíe a la propia clase, no a un objeto de esa
clase.
—Muy bien —me felicita—. Un método declarado como
static es un método de clase, del mismo modo que una
variable declarada como static es una variable de clase.
39
private final static TitulacionGradoInformatica
titulación;
86
© Alfaomega - RC Libros JAVA. LA NOVELA
87
NURIA MEDINA © Alfaomega - RC Libros
88
© Alfaomega - RC Libros JAVA. LA NOVELA
40
package docencia; /* La clase pertenece al paquete
docencia */
public class EstudianteGradoInformatica /* cabecera de
la clase */
{ //cuerpo de la clase (código entre llaves)
private String nombre; /* declaración de
variables de instancia y de clase */
...
public EstudianteGradoInformatica(...){...} /*
declaración de constructores */
...
public String getNombre(){...} /* declaración de
métodos de instancia y de clase */
...
}
89
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Él también parece cansado, las “ojeras” le llegan al suelo y
temo que pierda el hilo y se líe de nuevo la madeja. En ese
hipotético caso, tendré que controlarme, porque soy capaz
de meterle las agujas de tejer crochet por el...
—Ah, sí —retoma el discurso el señor Paradigma,
poniendo a salvo sus posaderas (metafóricamente hablando,
no quiero que haya malos entendidos)—, cuando un método
está declarado como package puede ser invocado por
cualquier clase que pertenezca al mismo paquete que la
clase actual, pero no por las clases que quedan fuera.
—Siendo prácticos, señor Paradigma, en mi caso: el
método que no tiene ningún modificador de acceso, y que
por tanto tiene visibilidad package, podrá ser solicitado
desde todas las clases incluidas en el paquete docencia.
90
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
91
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Mucho más cómodo, pero supongo que costará más
caro importar el paquete entero que solo una clase.
—Vale lo mismo —explica mientras esboza una sonrisa—,
cero euros en ambos casos.
41
package administracion; /* La clase SecretarioCentro
pertenece al paquete administracion */
import docencia.EstudianteGradoInformatica;
public class SecretarioCentro{
...cuerpo de la clase...
//puede usar EstudianteGradoInformatica
}
42
import docencia.*;
92
© Alfaomega - RC Libros JAVA. LA NOVELA
93
15. Sonríe y di “patata”
pcprogramasymas.com
código bailan pavorosas. Cada vez, el quejido es más longevo
y los renglones digitales se tuercen, y la “tinta” de los
caracteres se derrite como si una combustión
fantasmagórica los hiciese sudar. Comienzo a transpirar a
pesar de que los escalofríos ascienden por mi congelada
“espalda” como lagartijas sedientas de sangre. Chorreones
rojos, líquido infernal en el que se ha transfigurado la
coloración de las sentencias Java.
Junto a mí, el maestro duerme tan plácidamente como un
niño, ajeno a la zozobra que me embarga y a la oscuridad
que nos sobreviene. En la penumbra advierto, o más bien
siento, cómo su “pecho” crece y decrece cadencioso y cómo,
acompasadamente, el oxígeno binario juguetea con sus
“fosas nasales”: templado en la inhalación, ardiente en la
exhalación.
94
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
Debo calmarme y voy a hacerlo. Tengo fuerza de voluntad
y ha llegado el momento de demostrarlo. Voy a imitar su
postura. Suelto mis “rodillas” y libero las tensiones de mis
“músculos”, a duras penas, pero de forma efectiva. Adquiero
su posición, tumbado y con la “cabeza” ladeada hacia la
izquierda. Las “piernas” abiertas al ancho de las “caderas”,
las “palmas” de las “manos” vueltas hacia arriba, y el
95
NURIA MEDINA © Alfaomega - RC Libros
96
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
contraria a la órbita de atracción, con todas mis fuerzas y,
con las mismas, grito como un descosido:
—!Socorro!
—!Quiero vivirrrrrrrrrrrrrrrr!
Me despierto sobresaltado. Despego la “cabeza” del señor
Paradigma de mi “hombro” y me limpio el líquido viscoso del
cuello de la camisa. Estoy empapado en sudor y el maestro
me mira con “cara” de preocupación absoluta.
—¿Qué te ocurría? Jadeabas y gritabas pávido. ¿Has
tenido un mal sueño? —pregunta paternal.
No le respondo. Respiro profundo y despacio; bajo la
mirada, poquito a poco, hasta llegar a mi “ombligo”. Allí está:
el bendito “cordón”, justo en su sitio.
97
NURIA MEDINA © Alfaomega - RC Libros
98
© Alfaomega - RC Libros JAVA. LA NOVELA
100
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Por supuesto.
—¿Eh?
—Sí, la cámara tiene una función para fotografiar un
conjunto de clases de un solo disparo. Es una cámara muy
especial.
—Usted sí que es especial, señor Paradigma, me hace
sufrir por gusto —digo, pero no se disculpa. En su lugar, se
sopla el “pulgar” y acto seguido pulsa el botón mágico.
—Listo. Prepárate para regresar —sonríe blandiendo la
cámara en alto.
Nos cogemos de las “manos” y ascendemos, dando
esquinazo, por esta vez, al agüero negro de mis peores
sueños.
101
16. El método perdido
pcprogramasymas.com
balanceo de blancos, la abertura de diafragma y la velocidad
de obturación, ¡ni tocarlos!, me amenaza mientras me
apunta con “dedo” acusador.
Es evidente que está presumiendo de saberes fotográficos,
pero no hago aprecio a sus palabras. Estoy tan contento que
cuando me guardo la cámara en el bolsillo izquierdo, saco
del bolsillo derecho una duda que mi agitación por escapar
cuanto antes del código fuente casi consigue soterrar:
—Ahora que estamos a salvo en la RAM, maestro: ¿le
suena de algo la palabreja NullPointerException?
—Sí, claro. Es un error que se lanza en tiempo de
ejecución cuando en una aplicación Java se intenta pedir algo
a una variable que no contiene ningún objeto. Lógico, si le
envías un mensaje a una variable vacía (null) se producirá
102
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Blanco es y la gallina lo pone. Lo correcto sería
introducir un objeto en la variable 44. ¿Cómo se puede olvidar
lo más importante: crear el objeto? —pregunto perplejo ante
semejante despiste.
—Bueno, no hay que ser tan intransigente. Todos
cometemos fallos —apunta condescendiente—. En concreto,
este, algunas veces, se debe a un “cruce de cables”, pues
existen otros lenguajes de programación donde al declarar
una variable se crea automáticamente un objeto de la clase
43
Empleado unEmpleado; //unEmpleado es null
… //no se introduce ningún objeto en unEmpleado
unEmpleado.trabaja(); /* daría NullPointerException,
NO HAY OBJETO QUE PUEDA RESPONDER */
44
unEmpleado = new Empleado(“Ricardo Álvarez, 33,...);
103
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
NullPointerException.
—¿Clase?
—Sí, existe una clase llamada NullPointerException, ya
que los errores de este tipo son tan objetos como tú.
—Anda, ¿qué curioso?, ¿hay objetos que representan
errores?
—Así es.
—¿Y qué atributos tienen?
104
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
de pelotas...
—Todos los métodos pueden lanzar la excepción siempre
que lo declaren en su cabecera 48; excepto el método main
45
CloneNotSupportedException,IOException,FileNotFoundException,
EmptyStackException, etc.
46
throw new Exception(“Mensaje de error”); /* o por
ejemplo: */
throw new FileNotFoundException(“no hay ningún fichero
con ese nombre”);
47
try{...código que puede lanzar una excepción...}
catch(Exception e) {...código para tratar la excepción
recogida en la variable e...}
48
public void metodoX(...)throws Exception {...cuerpo
del métodoX, el cual contiene una sentencia throw o llama
a un método que en su cabecera ha declarado throws
Exception...}
105
NURIA MEDINA © Alfaomega - RC Libros
49
var.addAsignaturaMatricula(unaAsignatura);
106
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
mientras, a la más mínima oportunidad, trasteo la cámara
fotográfica bajo la tela del pantalón. Su tacto me hipnotiza, y
el contraste entre el aluminio de la carcasa y el cristal líquido
de la pantalla, me invita a rodar las “yemas” de una parte a
otra del aparato sin tener el cuidado prometido.
Pese al manoseo, la explicación del maestro no cae en
saco roto, y entiendo perfectamente los diferentes canales de
comunicación. El primero, el más fuerte, es el canal
<<association>> que permite a cualquier objeto enviarle
mensajes a sus atributos (solo a los atributos que sean
objetos, no a valores primitivos, como es evidente). Gracias a
ello, yo mismo podría ser el objeto emisor de un mensaje
que pudiera enviar a mi atributo fechaNacimiento,
107
NURIA MEDINA © Alfaomega - RC Libros
50
public class EstudianteGradoInformatica{
...
GregorianCalendar fechaNacimiento; /* variable de
instancia */
...
public int calculaEdad(){
...
int year = fechaNacimiento.get(Calendar.YEAR);
/* el objeto emisor de get (Calendar.YEAR) es un objeto
pcprogramasymas.com
de la clase EstudianteGradoInformatica y su atributo
fechaNacimiento es el objeto receptor */
...
}
...
}
51
public class EstudianteGradoInformatica{
...
public void unMetodo(){
...
int edad = this.calculaEdad(); /* this es una
pseudovariable que representa al objeto receptor del
mensaje unMetodo(). Dicho objeto pertenece a la clase
EstudianteGradoInformatica y es, a su vez, el emisor y
receptor de calculaEdad().
Equivalente habría sido poner únicamente calculaEdad();
(sin receptor explícito se sobreentiende el receptor del
mensaje actual)*/
...
}
...
}
108
© Alfaomega - RC Libros JAVA. LA NOVELA
52
public class EstudianteGradoInformatica{
GregorianCalendar fechaNacimiento;
...
public void otroMetodo(GregorianCalendar otraFecha){
...
if (otraFecha.before(fechaNacimiento)){...} /* el
emisor de before es un objeto de la clase
EstudianteGradoInformatica y el receptor es el argumento
del método otroMetodo */
} pcprogramasymas.com
...
...
}
53
public class EstudianteGradoInformatica{
GregorianCalendar fechaNacimiento;
...
public void imprimeFecha(){
...
String fecha = fechaNacimiento.toString();
String fechaFelicitacion = fecha.concat(“happy
birthday”);
/* el emisor de concat es un objeto de la clase
EstudianteGradoInformatica y fecha, el objeto receptor,
es una variable local del método imprimeFecha */
...
}
...
}
109
NURIA MEDINA © Alfaomega - RC Libros
—¿1000?
—Señor Paradigma, digo 1000 por decir un número.
Supongo que habrá clases con más instancias que otras.
—Sí, sí, claro... Razón no te falta. El uso de clases es un
mecanismo de reutilización fundamental, sobre todo cuando
hay muchos objetos del mismo tipo, como es el caso de
estudiantes del Grado en Informática en la UGR. Pero la
herencia es reutilización a nivel de clase, no de objeto.
—No entiendo el matiz.
—Palmario, no te lo he explicado. Siéntate, hay muchos
matices que debo enseñarte a distinguir. —Levanto la
“barbilla” y me dispongo a llevarme la “mano” al “mentón”
cuando, el señor Paradigma añade—: nada de fingir profuso
interés, ni de asentir mientras piensas en las musarañas, que
pcprogramasymas.com
ya nos vamos conociendo...
Me desarma la gesticulación y me concentro en su
explicación. ¿Qué remedio queda?
112
17. Herencia
pcprogramasymas.com
54
Los métodos constructores no se heredan
55
En los lenguajes orientados a objetos puros todo es
un objeto (incluidas las clases). Ejemplos de este otro
tipo de lenguajes son Smalltalk y Ruby
114
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
volver a escribirlos. Se vuelve especialmente pesado cuando
enfatiza que la clase hija puede añadir nuevos atributos y
métodos, o redefinir los heredados. Todo eso ya lo había
dicho. La clase hija es una extensión de la clase padre.
—¿Qué significa redefinir? —pregunto para constatar que
es lo que me imagino.
—Redefinición de métodos, como su propio nombre
indica, consiste en volver a definir los métodos. Es decir, si la
clase hija no está de acuerdo en cómo está implementado
uno de los métodos que ha heredado de su clase padre
puede escribir un método con igual cabecera pero distinto
cuerpo. Vamos, que se puede cambiar la implementación de
un método heredado en la subclase.
—¿Subclase?
115
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Ilustración 11. Un atributo o un método declarado en una clase
como protected puede ser accedido de forma directa desde
determinadas clases que quedan fuera del paquete de la clase
actual, siempre y cuando dichas clases hereden de ella. Por el
contrario, por defecto (package), la visibilidad se limita a las
clases del mismo paquete.
56
public EstudianteGradoInformatica extends
EstudianteGrado {... cuerpo de la clase...}
118
© Alfaomega - RC Libros JAVA. LA NOVELA
el
pcprogramasymas.com
placer conocerlo»), y eureka: en el cuerpo de la clase aparece
método addAsignaturaMatricula(Asignatura
nuevaAsignatura) . Escudriño la implementación encerrada
58
57
public EstudianteGrado extends EstudianteUGR
{...cuerpo de la clase...}
58
public void addAsignaturaMatricula(Asignatura
nuevaAsignatura){
matricula.add(nuevaAsignatura);
}
119
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
No es para menos. No se le ha perdido ningún “quicio”,
sino que se ha echado encima unos cuantos y regresa
convertido en un nuevo “Arnol Suarseneguer” paradigmático.
Madre mía, está enorme, pero no a lo redondo, sino a lo
cuadrado. Se ha colocado una camiseta de tirantes roja y los
“músculos” le sobresalen por doquier. Está bronceado y
tiene los “bíceps” más torneados que he visto. ¿Qué digo
bíceps?: “deltoides”, “bíceps”, “tríceps”, “romboides”… Y eso
que casi no me atrevo a mirarle las “piernas”. ¡Qué
“muslamen” le marcan esos pantaloncitos cortos! Duele la
vista.
—Habla muchacho, ¿te ha comido la “lengua” el gato? —pre-
gunta sonriente, mientras estira el “psoas ilíaco”.
59
private List<Asignatura> matricula;
120
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
Qué musculitos tan transcendental... No sé si podré
soportar otra parrafada así, pero… ¡cómo para llevarle la
contraria ahora! Menudo sopapo me podría meter.
—Muchacho, sigo siendo el mismo. Recuerda que
nuestros atributos no definen nuestra esencia.
—No, claro. Pero sí imprimen fuerza al golpe —bromeo,
atrevido.
—Déjalo ya, no voy a darte —formula cual macarra—.
Vamos a seguir hablando de la herencia, si te parece.
—Sí, claro. Tengo algunas preguntas.
—Dispara.
121
NURIA MEDINA © Alfaomega - RC Libros
122
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Anda, pues es verdad. Además, en la clase
EstudianteGradoInformatica pasa lo mismo, aparece el
método clone() con un @Override delante de la cabecera. Eso
es porque la herencia es transitiva, con lo cual, mi clase
también acaba heredando de Object. Pero, ya puestos, ¿para
qué sirve ese método?
—El método clone() hace una copia del objeto receptor.
Es muy útil para facilitar la creación de nuevos objetos
iguales o muy similares a otros existentes. También para
proteger la privacidad de los atributos de un objeto.
—¿Cómo se conseguía esto último?
123
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Me he ido. ¿Soy yo o también se ha hecho un
blanqueamiento dental? Paso página:
—Otra duda, señor Paradigma —no voy a preguntarle por
la blancura de sus “dientes”, descuide—: ¿por qué el método
clone() redefinido en mi clase declara en la cabecera que
60
public Profesor getTutorTrabajoFinGrado() {
return tutorTFG.clone();} /* tutorTFG es un atributo
de EstudianteGrado y un objeto de la clase Profesor */
61
public Profesor getTutorTrabajoFinGrado() { return
new Profesor(tutorTFG);}
62
public Profesor getTutorTrabajoFinGrado(){return
tutorTFG;} /* El tutor del estudiante, atributo tutorTFG,
se devuelve por valor (en Java todo se devuelve por
valor). Como es un puntero, lo que se copia es la
dirección de memoria (valor), dando acceso directo al
objeto original tutorTFG almacenado en el heap */
124
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
herencia. —Respira—. En cambio, la redefinición implica
que se vuelve a definir el mismo método, no otro, que se ha
heredado. Por esto, como te dije antes, al redefinir el método
clone() lo más que puedes cambiar en la cabecera es el
protected original por el modificador de acceso public que es
más flexible, pero nada más.
63
protected Object clone() /* Cabecera del método en
Object */
64
public int suma(int n1, int n2){...} //y
public float suma(float f1, float f2){...} //y
public int suma(int n1, int n2, int n3){...} /* son
sobrecargas del método suma */
125
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—... dentro de una variable declarada de tipo Object
puede meterse un objeto de cualquier clase —termino la
frase—. ¡Soberbio!
65
@Override
protected Object clone() {
return new EstudianteGradoInformatica(new
String(nombre),..., matricula.clone(),...); /* se crea un
nuevo estudiante con una copia de cada atributo del
estudiante receptor del mensaje de clonación */
}
126
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Sí —ríe enérgico y, sin venir a cuento, añade—: La vita
è bella.
Luego, se marcha trotando, aunque se detiene a intervalos
regulares para hacer flexiones o para seguir moldeando su
“tableta de chocolate” con una prolífera serie de
abdominales.
128
18. El árbol genealógico
pcprogramasymas.com
voy a pedir remedio ni ungüentos al señor Paradigma. Esta
magnificada capacidad extrasensorial no puede significar
nada bueno. Suena a luz al final del túnel.
—Chico, ¿otra vez pensando en la muerte? —Me
sorprende el señor Paradigma que reaparece saltando a la
comba al estilo Rocky Marciano. Según él, se ha fabricado la
cuerda con un cablecito que andaba suelto por ahí. Miedo me
da…
—No se preocupe, ya la miro con otros “ojos”.
—Pues no la mires tanto, que eres un bisoño y lo que
tienes que hacer es aprender de la vida y disfrutar.
129
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
sobre todo porque hay una cosa muy extraña en el código.
Seguro que es un asunto espinoso.
—¿Qué dices?, ¿espinas...?, ¡serán minas...!
—No sea mordaz —solicito—, se trata de una palabra que
no sé lo que quiere decir.
—Será el nombre de una variable.
—No puede ser una variable porque no está declarada
por ningún lado, ni se introduce como argumento en el
método.
—No des más rodeos y dime de qué palabra se trata.
130
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Vale, vale, no se justifique más. Explíqueme qué es
super.
—super es una pseudovariable, al igual que this.
—¿Pseudovariable?
—Se usa el término pseudovariable porque su valor no es
constante, pero tampoco puede ser un valor cualquiera.
Cuando en un método aparece la palabra reservada this está
haciendo alusión al objeto receptor de dicho mensaje. Y,
como estarás comprendiendo, el objeto receptor varía en
función de quién ha recibido la petición.
—¿Y super?
131
NURIA MEDINA © Alfaomega - RC Libros
66
public class ProfesorFuncionario extends Profesor{
...
@Override
public float calculaSueldo(){
return
super.calculaSueldo()+this.calculaComplementos();
}
...
}
132
© Alfaomega - RC Libros JAVA. LA NOVELA
133
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
67
public class ProfesorFuncionario extends Profesor{
...
private float complementoDocencia;
...
public setComplemento(float complementoDocencia){
this.complementoDocencia = complementoDocencia; /*
el primero hace referencia al atributo y el segundo al
argumento del método */
}
...
}
134
© Alfaomega - RC Libros JAVA. LA NOVELA
68
pcprogramasymas.com
public class ProfesorFuncionario extends Profesor{
...
private float complementoDocencia;
private float complementoInvestigacion;
...
public ProfesorFuncionario(String nombre,
GregorianCalendar fechaNacimiento,..., float
complementoDocencia, float complementoInvestigacion,...){
super(nombre, fechaNacimiento, ...);/* con el
constructor de Profesor se inicializan todos los
atributos heredados de Profesor y luego se inicializan
los atributos nuevos: */
this.complementoDocencia = complementoDocencia;
this.complementoInvestigacion =
complementoInvestigacion;
...
}
...
}
135
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Beso las fotografías de mi clase, una por una, con
devoción y dulzura. El cariño, cariño es; aunque se encierre
en un microchip y se codifique en unidades. La quiero. Es así
desde que la conocí, durante mi primer viaje astral, y mucho
más ahora que la estoy comprendiendo. Todo lo que soy, se
lo debo a ella; sangre de mi sangre, amantísima “mamá”.
Rompo a llorar y las lágrimas voltean por el visor de la
cámara, confundiéndose con las gotas de lluvia que entran
por mis “oídos” y se escurren tras mis “párpados”.
Doy gracias de que el maestro esté entretenido haciendo
press de banca. Pero a ti te lo puedo contar, porque tú sí que
me comprendes.
Me restriego los “ojos” y me sueno los mocos. He decidido
elaborar un árbol genealógico. Tendrá frondosas ramas y un
tronco corpulento, de corteza lisa, como la del baobab. No
136
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—En la memoria RAM no hay puertas ni timbres. ¿Qué te
pasa?
—Bueno, por lo menos salude —protesto.
—Anda, ven aquí —dice mientras me rodea entre sus
animosos “brazos”—, vamos a echarle un vistazo a la
jerarquía de herencia de Java, al completo, así podrás
contemplar un árbol selvático.
—¿Tan magnánimo es? —pregunto al tiempo que separo
un poco su “brazote” de mi “tórax”, la presión me estaba
asfixiando.
—Ya lo creo, en Java existen muchos paquetes de clases
predefinidas. Y luego están las clases propias de cada
programa que pueden agruparse en uno o varios paquetes.
137
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Las clases declaradas como final no pueden reutilizarse
mediante la herencia. Esto pasa por ejemplo con la clase
String69 . ¿Ves que String es un nodo hoja de la jerarquía de
herencia?
—Lo veo. ¡Mire! —exclamo—, en esta otra clase aparece
un método declarado como final70 .
—El modificador final puede aplicarse en la cabecera de
la clase y también en la cabecera de un método. En este
segundo caso, ¿adivinas lo que significa?
69
public final class String {...}
70
public final void metodoFinal(...){...}
138
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
que esto ya me lo había explicado —digo en alto, total, lo
mismo da—. Fíjese en esta otra clase —le pido mientras
señalo la clase AbstractAction—. Tiene muchísimas
subclases.
—Sí, además coincide que es una clase abstracta 72, lo que
significa que ha nacido para ser extendida.
—¿Perdón?, me he perdido.
—Pues encuéntrate —responde cortante, en línea con su
bipolaridad.
71
private final int atributoFinal = 10; /*
atributoFinal siempre valdrá 10 */
72
public abstract class AbstractAction {...} /*
aclaración: la clase no tiene que llevar la palabra
Abstract en el nombre */
139
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Porque en la clase abstracta se introduce la estructura y
el comportamiento común a todas sus subclases concretas y
luego cada subclase añade o redefine lo que considere
oportuno. ¿Reutilización?, ¿te suena?
—Ya está bien, señor Paradigma, no me trate como a un
tonto —le recrimino ofendido ante lo borde que se estaba
poniendo.
—Disculpa, Juan, es que saber reutilizar código es muy
importante, no solo por ahorrar esfuerzo sino para ganar en
fiabilidad, el código reutilizado suele estar mejor depurado.
—Me ha llamado Juan, hacía tiempo que no me llamaba
por mi nombre. —¿Estará cogiéndome cariño? Ahora su
140
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
un método sin implementar —añade el maestro con mirada
tierna.
—¿Un método sin cuerpo?
—Sí, para que no genere ningún error hay que colocar el
modificador abstract 73 en la cabecera de cada método
abstracto. Aunque debe haber como mínimo uno, pueden ser
varios.
—Entendido. ¿Qué pasaría si la subclase de una clase
abstracta no redefine los métodos abstractos?
73
public abstract int metodoAbstracto(); /* no tiene
cuerpo */
141
NURIA MEDINA © Alfaomega - RC Libros
142
19. Detenido por incumplimiento de
contrato
143
NURIA MEDINA © Alfaomega - RC Libros
145
NURIA MEDINA © Alfaomega - RC Libros
74
List<Asignatura> matricula = new List(); /* no está
permitido hacer el new List() porque List es una interfaz
*/
146
© Alfaomega - RC Libros JAVA. LA NOVELA
75
public interface List<E> extends Collection<E>{
boolean add(E e);
void add(int index, E element);
...
void clear(); /* declara el método, pero no lo
implementa */
...
E get(int index);
...
}
147
NURIA MEDINA © Alfaomega - RC Libros
76
public class ArrayList<E>...{... el parámetro E
aparecerá en algunas declaraciones de variables del
cuerpo de ArrayList...}
77
En el caso de List, una interfaz parametrizada
148
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—¿De qué tipo son entonces los objetos de la colección
declarada como ArrayList?
—¿Tú qué crees?
—Ni idea.
—¿Ni idea? Vaya... no eres tan fuerte mentalmente
—declara y saca bíceps “encefalótidos”.
Pienso y ambos nos echamos a reír, no puedo decirte por
qué. Ha sido un pensamiento fugaz, pero totalmente
descalabrado.
78
Integer es una clase que sirve para envolver al tipo
primitivo int
149
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Cuando una clase declara que cumple una interfaz 79 (lo
cual se consolida a través de la palabra reservada
implements) está obligada a implementar todos los métodos
declarados en la interfaz. Ahí está el compromiso.
—¿Con la misma cabecera? Quiero decir, ¿los métodos
deben ser implementados en la clase con exactamente la
misma cabecera que presentan en la interfaz?
—Sí, como ocurre en la redefinición de métodos
heredados.
79
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
/* en este caso, la clase ArrayList<E> implementa varias
interfaces, entre ellas List<E> */
150
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
lista (clear), devolver el elemento que hay en una
determinada posición (get), devolver el número total de
elementos (size)...; otra cosa es cómo se codifiquen esas
responsabilidades.
—Exacto —coincide—. Por ejemplo, las clases ArrayList y
LinkedList implementan la interfaz List cada una a su manera.
No obstante, en ambos casos, el cumplimiento del contrato
está garantizado. La mayoría de las veces, el cómo no nos
interesa.
—Es verdad —reflexiono y me surgen nuevas
cuestiones—: ¿qué pasaría si una clase no implementa un
método incluido en la interfaz que ha declarado cumplir?
—La policía vendría a detenerla por incumplimiento de
contrato.
151
NURIA MEDINA © Alfaomega - RC Libros
—¿La policía?
—Olvídalo, era una broma mala. Si le falta por
implementar algún método declarado en la interfaz, la clase
no tendría más remedio que ser declarada abstracta.
—Anda —expreso extasiado ante lo relacionado que está
todo en Java—. Y... se me ocurre...: ¿sería posible que una
clase implementase varias interfaces? Debería serlo porque
una clase podría cumplir varios contratos —opino.
—Y es posible —confirma el maestro—. Una clase puede
implementar cuantas interfaces quiera. Ahora, si falta un
único método de los declarados en tales interfaces, será una
clase abstracta.
—¡Oído cocina! —exclamo, para hacer patente que todo
ha quedado blanco sobre negro.
pcprogramasymas.com
—Bien, bien —retoma el tono irónico—. Entonces ya
habrás adivinado que el uso de interfaces permite simular la
herencia múltiple.
—Sí —elevo la voz y finjo agarrar un micrófono—, la
herencia múltiple se puede simular en Java de tres formas:1)
una clase que hereda de otra clase e implementa una interfaz,
2) una clase que implementa varias interfaces o 3) una clase
que implementa una interfaz que, a su vez, hereda de varias
interfaces —recito de corrido y añado—: ¿oído cocina?
—Oído, oído —musita el señor Paradigma mientras
parpadea sobre sus derrotadas “pupilas”.
Otro pensamiento fugaz y ambos caemos rodando al suelo,
destornillándonos ante la disparatada escena que tiene lugar
en nuestras sincronizadas mentes.
152
20. Vídeos polimórficos
—¿Hola?
—¿Juan?
—¿No hay nadie?
Camino hacia delante, a la derecha, vuelta atrás y a la
izquierda cerrando el cuadrado imaginario. No lo veo por
ningún lado…
—Deja de jugar al escondite, muchacho. No hay tiempo.
—¡¿Hola?!
pcprogramasymas.com
—¿Dónde te has metido?
—¡¿Dónde te has metido?!
—¡¿Dónde te has metiiiiido?!
Me estoy poniendo muy nervioso (con lo relajado que
estaba en la posición de La Vela). Mejor será que deje de
gritar porque tengo la “boca” reseca y el “corazón” acelerado
y me está dando vértigo.
Detengo mi correteo de aquí para allá y me siento.
Respiro lento y coloco las “palmas” de mis “manos”
formando un triángulo bajo el que cobijo mi “nariz”. Luego,
con los dos “dedos” que conforman el vértice del triángulo
me masajeo el “tabique nasal” y asciendo obrando presión
en el “entrecejo” hasta alcanzar la “frente”. Aprieto en el
153
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—¿Dónde está Juan? El objeto. Ya sabes...
Grillos.
—¿No sabes nada? Vaya. ¿Dónde diantres se habrá metido?
Es el objeto más especial que he tenido la oportunidad de
tutelar. Jamás otro me dio tantos quebraderos de “cabeza”,
ni tantas satisfacciones. Es inteligente el chico. Lástima que
le quede tan poco. Le echaré de menos, cuando se vaya.
Porque… no puede haberse ido aún. No. Por favor.
Todavía no…
«Debo pensar en positivo», me aconsejo y le propino un
rumboso empujón a mis temores. No puede haberse
marchado todavía. Voy a pensar, mejor, en cómo aprovechar
el tiempo que nos queda juntos. Idearé un buen plan. Pero
154
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
puertas en lugar de un paradigma de programación
orientado a objetos.
—Tus deseos son órdenes. Me he pasado al yoga —sonríe
y me achucha—. ¿Dónde has estado? —me pregunta,
visiblemente aliviado por nuestro reencuentro.
—No le va a gustar, pero se va a quedar de piedra.
—A estas alturas no hay nada que pueda sorprenderme.
—¿Seguro?
—Seguro —me desafía.
—Agárrese los machos que voy...
—Déjate de vulgaridades y explícate —exige.
155
NURIA MEDINA © Alfaomega - RC Libros
156
© Alfaomega - RC Libros JAVA. LA NOVELA
¡Cataplum!
—Tranquilo, señor Paradigma, respire. —El maestro se
ha desplomado y trato con todas mis fuerzas de colocarle las
“piernas” en alto. Ahora le doy aire con ambas “manos”.
Pobrecito—. ¡Respire, respire! —Parece que vuelve en sí.
Recuesto al maestro sobre su “espalda” sin dejar de
abanicarlo y le sigo explicando lo acontecido, ahora con
bastante más mano izquierda. Me ha hecho jurar que
únicamente he visto vídeos que trataban temas de
orientación a objetos. Que Dios me perdone. Le he mentido.
Imagina. He visto de TODO.
—Muchacho, eso que has hecho está muy mal. No forma
parte de tus responsabilidades. ¿Por qué lo hiciste?
—Solo quería sentirme libre y como le he empezado a
pcprogramasymas.com
contar: adelanté un “pie” y el otro se empeñó en
acompañarlo... Ha venido todo rodado.
—¡No retomes esa línea de defensa, que me exasperas!
—Me silencia de malos modos, y añade con fingida
desidia—: anda, desembucha: ¿qué es lo que más te ha
llamado la atención de esos vídeos tutoriales?
—Una grabación que se titulaba: “Compilación de un
programa en Java”. —Le miento de nuevo porque lo que más
me ha llamado la atención ya te lo puedes figurarrrrrrr.
—Borra esa “cara” de vicio y detállame lo que has
aprendido del compilador —sugiere a la par que me propina
un sonoro manotazo.
—¡Ay! —me quejo—. Ha sido interesante ver al
compilador en acción, pero casi todo lo que salía en los
158
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
dónde habrá salido? Me doy una palmada en la “espalda”
para espantarla, pero el bicho no respira. La “cara” del
maestro es un poema fúnebre; la mía, más propia del tenor
de una ópera trágica.
Meneo la “cabeza” para espantar los fantasmas. Tampoco
existen, como la lagartija. Eso me anima un poco y continúo
relatándole al señor Paradigma las meteduras de pata del
compilador:
—Había una clase abstracta llamada FiguraGeometrica de la
cual heredaban las clases Circulo y Cuadrado (entre otras) 80 . Cada
80
abstract class FiguraGeometrica{...}
class Circulo extends FiguraGeometrica{...}
class Cuadrado extends FiguraGeometrica{...}
159
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
el error.
—Ya, por eso no eres compilador —afirma malicioso. A
pesar del cariño que nos profesamos tengo que reconocer
que es un puñetero—. Voy a simular que soy el compilador,
¿de acuerdo?
—De acuerdo —consiento.
—A una variable declarada de tipo Circulo le llega el
mensaje toString(). ¿Voy bien?
—Sí —respondo de mala gana.
—Entonces, busco en la clase Circulo el método que
resuelve esa responsabilidad. Como no hay ninguno que
encaje con la cabecera toString(), me muevo al código de la
160
© Alfaomega - RC Libros JAVA. LA NOVELA
81
System.out.println(“mensaje a imprimir por
pantalla”);
161
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—¿Polimórfica? —La terminación “mórfica” se asocia en
mi “cerebro” con la palabra morfología, disparando en mi
retina la proyección de las voluptuosas imágenes
visualizadas en los vídeos. Me relamo y el señor Paradigma
me propina un posiblemente merecido cocotazo.
—Polimórfica significa que puede tomar varias formas 83.
Ahora es un círculo, ahora es un cuadrado. La regla de
compatibilidad de tipos permite este polimorfismo, ya que
82
abstract class FiguraGeometrica implements Figura{…}
83
Figura unaVar;
unaVar = new Circulo(3,5,7);
...
unaVar = new Cuadrado (1,1,2);
...
162
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
luego déjeme continuar con mi narración del fallo del
compilador.
84
Figura unaVar;
unaVar = new Circulo(3,5,7);
unaVar.area(); //polimorfismo de mensajes
unaVar = new Cuadrado (1,1,2);
unaVar.area(); //polimorfismo de mensajes
163
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
Ilustración 13. El tipo declarado para una variable restringe qué
mensajes se le pueden enviar; pero, si hay ligadura dinámica, el
resultado del mensaje depende del objeto que en cada momento
contiene la variable.
164
21. Ligadura dinámica
pcprogramasymas.com
Nada, ni caso me hace. Voy a dejarlo tranquilo un rato.
Silbo. Camino. Me cruzo de “brazos”. Me descruzo. Silbo.
Camino. Me cruzo de “brazos”. Me descruzo. Silbo…
— ¡¿Ha terminado de meditar ya?! —grito cuando me
harto.
Abre los “ojos”, medio lelo, y pregunta:
—¿Dónde estoy? —Suena confuso pero bondadoso.
Ahora me da pena haber sido tan brusco.
—Maestro, me estaba explicando lo que es la ligadura
dinámica —digo bajito como si no quisiera despertarlo.
Aunque no está dormido, por los “pelos” (que no tiene).
165
NURIA MEDINA © Alfaomega - RC Libros
85
unaVar.mensaje(arg1, arg2,...,argn); /* el mensaje
se debe ligar a un método llamado de la misma forma. Este
proceso se conoce como ligadura de mensajes */
166
© Alfaomega - RC Libros JAVA. LA NOVELA
86
1. Figura unaVar;
2. unaVar = new Circulo(3,5,7);
2
3. unaVar.area(); //devuelve el área según PI*radio
...
7. unaVar = new Cuadrado(1,1,2);
2
8. unaVar.area(); //devuelve el área según lado
167
NURIA MEDINA © Alfaomega - RC Libros
87
1.Figura unaVar;
2. unaVar = new Circulo(3,5,7);
2
3. unaVar.area(); /* devuelve el área según PI*radio
(el compilador no “protesta” porque el método area() está
declarado en Figura, y el intérprete trabaja en ejecución
con el tipo dinámico que es Circulo) */
4. unaVar.radio(); /* da error en tiempo de compilación
porque el método radio() no está declarado en la interfaz
Figura (el compilador trabaja con tipos estáticos) */
168
© Alfaomega - RC Libros JAVA. LA NOVELA
88
(Tipo)unaVariable //o
(Tipo)unaVariable.mensaje() /* cuando el resultado del
mensaje es un objeto */
//en ambos casos, el tipo debe ser una clase o interfaz
169
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—Haremos algo mucho mejor que eso —anuncia
exultante—. He preparado un plan para que nos divirtamos
un poco.
—Un plan “lúdico-educativo” —supongo y suspiro.
—Solo lúdico —afirma con exagerado brío.
Habrá que verlo…
170
22. Reflexiones
pcprogramasymas.com
observar semejante envío de mensajes. Según el maestro, los
profesores de afuera, los de carne y hueso, estaban
preparando las fichas de sus asignaturas, y las peticiones de
mete(tema) y saca(tema) se sucedieron durante un buen
rato, poniendo patas arriba el ArrayList<Tema> llamado
temario en prácticamente todos los objetos de la clase
Asignatura.
Para paliar el hastío y a compás del movimiento, me
inventé una canción que decía: “métela sácala, métela sácala,
métela sácala..., mete la pierna, saca la pierna... mete la
pierna, saca la pierna...” Aunque pueda parecer increíble me
habría hecho famoso si Félix Contreras no me hubiera
tomado la delantera...
En fin, si tuviésemos palomitas o me hubieran enviado
algún mensaje a mí, la cosa habría tenido algo de chispa.
171
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
“pies”.
—Señor Paradigma, he sido un desagradecido. Algo
tranquilo estaría bien, pero no lo que usted propone,
precisamente.
—¿Qué planteas? —consulta indómito.
—Le cuento…
Cuando termino mi exposición, el señor Paradigma niega
con la “cabeza”. Mi plan no lo ve factible: sentarnos en el
zócalo de la CPU y darnos un masaje relajante con los
“pinchitos” electromecánicos. Llorar y recoger las lágrimas
en una tecla para montarnos un jacuzzi. Colocarnos, después,
pétalos de rosas y piel de uva en todo el “cuerpo” y bebernos
una infusión de granadina mientras jugamos con las
burbujas.
172
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
phone de última generación. El tiempo se detiene mientras lo
estreno y el maestro de tanto hablar se queda sin saliva, pero
aun así sigue envolviéndome con sus palabras para que viva
todo lo que quería vivir, hasta el final.
—Juan, volvemos, ¿vale? Inhala con más energía y regresa
al aquí y al ahora.
Respiro y me estiro.
—Abre los “ojos”.
Le obedezco, abro los “ojos” y sonrío complacido.
—¿Lo has pasado bien? —me pregunta, aunque ya sabe la
respuesta.
173
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
objeto de la clase Naranja debería admitir el mensaje
exprimir() y si sacamos un objeto de la clase Lapiz debería
poder escribir(). ¿Cómo podríamos saber en tiempo de
compilación de qué clase es el objeto que va a salir de la
colección durante la ejecución del programa? Necesitamos
saberlo en compilación para poder hacer el casting y que el
compilador permita los mensajes propios del tipo dinámico.
—No siempre es posible saberlo en tiempo de
compilación. Como tú mismo has puesto sobre la mesa,
puede que no lo sepamos hasta el tiempo de ejecución. Quizá
el objeto que se saca de la colección sea aleatorio o dependa
de la interacción del usuario. Lo normal es que ahí no
podamos hacer el casting.
—¿Entonces? —empieza a picarme la curiosidad (de
verdad).
174
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Ya, muy interesante, pero ¿cómo encaja eso con mi
pregunta? ¿Cómo puedo saber de qué clase es el objeto que
hay en una determinada posición de una colección de
objetos variados?
—A cualquier objeto podemos enviarle el mensaje
getClass(). Se trata de un método 89 implementado en Object y
devuelve un objeto de la clase Class que describe la clase del
objeto receptor 90. Además, es un método final, lo que
significa que no se puede redefinir. Esto garantiza que
89
public final Class getClass(){...} /* método
implementado en Object */
90
Class c = var.getClass(); /* en el caso del objeto
“Juan” (almacenado en la variable var) el objeto c
describiría la clase EstudianteGradoInformatica */
175
NURIA MEDINA © Alfaomega - RC Libros
176
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—Se devuelve un array de objetos de la clase Method si
hemos solicitado los métodos, un array de la clase Field si
hemos solicitado los atributos y un array de la clase Class si
91
ArrayList cesto = new ArrayList();
... //meter objetos de distinto tipo en el cesto
for (Object o: cesto){
if (o.getClass().getName().equals(“Naranja”)){
((Naranja) o).exprimir();
}
if (o.getClass().getName().equals(“Lapiz”)){
((Lapiz) o).escribir();
}
...
}
177
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
—A un objeto Field podemos preguntarle también por su
tipo estático, el declarado (getType); y en el caso de un
objeto Method podremos saber el tipo de retorno
(getReturnType) y el tipo de sus argumentos
(getParameterTypes).
—No sé si lo entiendo… —repito porque estoy bastante
confundido. Es como que mi trabajo cognitivo estuviera
sufriendo interferencias. El apagón final está al caer…
92
Class describeClaseDeVar = var.getClass();
Method[] metodos = describeClaseDeVar.getMethods();
int modificadores1 = metodos[1].getModifiers();
boolean esAbstracto =
Modifier.isAbstract(modificadores1); /* devolvería
true si el primer método de la clase es abstracto */
178
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
objeto Class que describe una clase, se le puede preguntar
cualquier cosa sobre su código —resumo con sinceridad y el
maestro sonríe—. Para lograr el objeto Class usaremos el
mensaje getClass().
—¡Estupendo! —aclama con exagerado fervor—. La
forma más común de obtener el objeto Class que describe
una clase es solicitándoselo a una instancia de la misma con
getClass(); pero si no existe ninguna instancia o si ni siquiera
conocemos la clase (quizá la vayamos a pedir por teclado)
podemos usar el método forName 93. Es un método de clase,
93
Class describeClaseEstudianteGradoInformatica =
Class.forName(“EstudianteGradoInformatica”); /* El método
que incluye esta sentencia debe capturar o declarar una
excepción por si la clase especificada no existe en
tiempo de ejecución) */
179
NURIA MEDINA © Alfaomega - RC Libros
94
Application Programming Interface
180
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
181
23. aDios
95
Interfaz Serializable que hay que implementar para
poder obtener el estado de un objeto como una secuencia
de bytes
96
Clases File, FileReader, BufferedReader...
182
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
—¿Con qué te quedas? —pregunta, escudriñando mi
“rostro” para discernir si estaré en condiciones de responder
algo sensato. Sabe que mi conciencia está llegando a la sala
oscura.
—Con los objetos, sin duda —reímos y sorbemos—. Los
objetos somos la naturaleza del programa, la parte viva. Una
97
Integración con una base de datos: JPA, JDO, JPQL...
98
BD que almacena la información como objetos, se
puede integrar con el programa mediante el OBMDS
99
Interfaz gráfica de usuario basada en componentes
100
Hebras para concurrencia
101
Aplicación Java que se ejecuta dentro de una página
web
102
Programa Java que se ejecuta dentro de un servidor
web
183
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
incrustando sombrías pausas en nuestra última
conversación.
—Los objetos sois la unidad de ejecución y las clases son
la unidad de programación —resume el señor Paradigma
que, maestro hasta el final, no se resiste a dejar de emplear
los términos correctos.
—¿Qué fue antes la gallina o el huevo? —suelto de
improviso.
—No hay objetos sin clases, ni clases sin objetos. Es cierto
—convierte en reflexión mi delirio y me cubre de besos. Pero
me ha mentido como un bellaco: existen lenguajes de
programación basados en prototipos donde no se contempla
el concepto de clase, aunque no es el caso de Java; e, incluso
en Java, pueden existir clases sin objetos (como debe ser por
184
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
sin apenas fuerza—. Trata de un grupo de objetos
colaborando para resolver un problema planteado en forma
de clases.
—¿Te agrada entonces ser un objeto?
—Me encanta —reconozco desolado ante el final que me
espera.
—¿Más que ser un compilador? —formula de forma
íntima.
103
public static void main(String[] args){...método por
el que comienza la ejecución del programa...}
185
NURIA MEDINA © Alfaomega - RC Libros
186
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
«Seguirás viviendo un tiempo», afirma y pulsa el botón de
reset.
Tras la “explosión”, el paradigma de orientación a objetos
se aleja, aunque siempre estará ahí, esperando a que alguien
especial quiera aprender de él. Camina despacio,
meneándose como los cangrejos hacia atrás. No puede dejar
de mirarlo. A su amigo, el objeto más excepcional que ha
tenido la oportunidad de tutelar, al más inteligente. Ahora,
un objeto al uso, uno más de la unidad de ejecución.
Mientras lo observa, le llega una petición. El verdadero
Juan ha sacado matrícula de honor en programación y la
calificación debe ser anotada en su expediente. «Estás
ejecutando el método maravillosamente», anima a su
discípulo, aun cuando sabe que ya no puede escucharlo.
187
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
188
© Alfaomega - RC Libros JAVA. LA NOVELA
190
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
identificador de la clase (NombreClase) que aparece tras la
palabra reservada class debería ser un sustantivo escrito con
el estilo UpperCamelCase. Esto significa que debe comenzar
con mayúscula y cuando se requieren varias palabras, la
primera letra de cada una de ellas también irá en mayúscula.
La sentencia extends indica cuál es la clase padre
(NombreSuperClase) de la clase que estamos definiendo. Si
no se indica nada, se hereda por defecto de la clase Object.
Después de la herencia, se puede indicar la interfaz o
interfaces (separadas por comas) que la clase implementa.
104
Conjunto de reglas para la elección de la secuencia
de caracteres que se utilizará en los identificadores que
denotan variables, tipos, métodos y otras entidades en el
código fuente y la documentación
191
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
visibilidad es package (paquete).
Si se incluye la palabra static en la declaración de la
variable, avisa de que es una variable de clase. En su defecto,
es una variable de instancia (propia de cada objeto de la
clase).
Si se incluye el modificador final significa que una vez
inicializada la variable, no se podrá cambiar su valor.
Estos tres elementos (visibilidad, static y final) pueden ir
en cualquier orden, aunque el aquí presentado es el más
habitual.
El tipo de la variable (tipoVariable) puede ser un tipo
primitivo (int, char…), una clase o una interfaz.
192
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
La declaración de un método varía según sea un método
abstracto o no.
<declaracionMetodoNoAbstracto> ::= <cabeceraMetodo>
<cuerpoMetodo>
<declaracionMetodoAbstracto> ::= <cabeceraMetodoAbstracto>“;”
En el caso de los métodos abstractos, únicamente se
proporciona la cabecera del método seguida de un punto y
coma. En los métodos no abstractos, a la cabecera le sigue el
cuerpo con la implementación de la responsabilidad
asociada al método.
<cabeceraMetodo> ::= [“private” | “protected” | “public”]
[“static”] [“final”] (tipoRetorno | “void”) nombreMetodo
193
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
La invocación del método puede proporcionar una
respuesta tras su ejecución. En caso de que el método no
devuelva nada, se indicará en su cabecera con la palabra
reservada void. En caso de que sí devuelva, es necesario
proporcionar el tipo del valor de retorno. Dicho tipo
(tipoRetorno) puede ser un tipo primitivo, una clase o una
interfaz. En este caso, también será obligada una sentencia
return en el cuerpo del método.
El nombre del método (nombreMetodo) debe ser
significativo y como las variables utiliza el estilo
lowerCamelCase.
El método puede ir sin argumentos o necesitar uno o
varios de estos para funcionar. Para cada argumento hay que
194
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
El cuerpo del método delimita entre llaves un conjunto de
sentencias que, aunque no es lo común, puede quedarse
vacío.
Cada sentencia representa una acción o secuencia de
acciones, y en Java, todas las sentencias terminan con un
punto y coma. Las sentencias pueden ser: literales,
expresiones, sentencias de asignación, sentencias de
selección, de repetición, devolución de un valor primitivo u
objeto al finalizar la ejecución del método (return), etc.
195
NURIA MEDINA © Alfaomega - RC Libros
Una interfaz, al igual que una clase, está formada por una
cabecera y un cuerpo (precedidos de una declaración de
paquetes).
La declaración de paquetes para las interfaces funciona de
modo similar que en las clases.
<cabeceraInterfaz> ::= [“public”] “interface”
NombreInterfaz [“extends” NombreSuperInterfaz {“,”
NombreOtraSuperInterfaz }]
En la cabecera de una interfaz, lo primero que puede
aparecer es la palabra reservada “public” indicando que la
interfaz es visible fuera de su paquete.
El nombre de la interfaz, igual que ocurre con las clases,
debe seguir el estilo UpperCamelCase.
Las interfaces pueden heredar de ninguna, una o varias
pcprogramasymas.com
superinterfaces (separadas por comas si hay más de una)
usando la palabra reservada extends.
<cuerpoInterfaz> ::= “{“ {<declaracionConstante>}
{<declaracionMetodo>} “}”
Encerrado entre llaves, el cuerpo de la interfaz incluye las
declaraciones de constantes y métodos.
<declaracionConstante> ::= [“static”] [“final”]
tipoConstante NOMBRE_CONSTANTE “=” valor “;”
Por defecto (aunque no se ponga nada), las constantes de
la interfaz son static final; ya que las interfaces no pueden
instanciarse y las constantes no pueden modificar su valor.
196
© Alfaomega - RC Libros JAVA. LA NOVELA
197
NURIA MEDINA © Alfaomega - RC Libros
pcprogramasymas.com
105
En opinión de la autora, esto tiene sus pros y
contras, ya que amplía las posibilidades de reutilización
de código pero desvirtúa ligeramente el concepto de
interfaz como un contrato. Las clases abstractas ya
permitían tener unos métodos implementados y otros sin
implementar (aunque, evidentemente, no tenían herencia
múltiple como es el caso de las interfaces). Esta novedad
de Java 8 permite tener herencia múltiple de métodos a
través de las interfaces
198
© Alfaomega - RC Libros JAVA. LA NOVELA
Índice de contenidos
pcprogramasymas.com
atributos complejos, 68 162
Class, 175, 176, 177, 178, 179, 180
clone, 123, 124, 125, 126
B código fuente, 25, 27, 37, 44, 51, 52,
55, 74, 80, 83, 94, 98, 100, 102,
bytecode, 51, 52, 55
110, 129
colección, 14, 69, 84, 104, 119, 149,
C 174, 176
compilación, 166, 168, 169, 174
cabecera, 27, 28, 33, 34, 88, 89, 92,
compilador, 49, 52, 55, 158, 159, 160,
100, 105, 115, 116, 118, 119, 122,
161, 162, 163, 164, 168, 169, 170,
123, 124, 125, 126, 138, 141, 147,
174, 185, 186
150, 160
constructor, 39, 40, 41, 42, 46, 104,
canales de comunicación, 107, 110
124, 135
casting, 169, 170, 174
consultor, 73, 75, 81, 82, 83, 124, 128
clase, 25, 26, 29, 34, 35, 37, 38, 39,
40, 42, 43, 46, 54, 55, 67, 68, 73,
74, 75, 78, 80, 81, 82, 83, 86, 87, E
88, 89, 90, 91, 92, 98, 100, 103,
encapsulación, 81, 87
104, 108, 109, 110, 111, 112, 114,
encapsulamiento, 73, 74, 83, 124
115, 116, 117, 118, 119, 120, 122,
199
NURIA MEDINA © Alfaomega - RC Libros
estado, 14, 15, 16, 43, 47, 54, 66, 67, 122, 137, 145, 146, 152, 158, 161,
69, 72, 73, 83, 85, 95, 111, 120, 163, 166, 168, 169, 174, 179, 180,
131, 155, 156, 157, 165, 182 182, 183, 184, 185
excepción, 105 jerarquía de herencia, 123, 138
excepciones, 105
Exception, 105
extends, 118, 119, 122, 123, 132, 134,
L
147, 150, 159, 161 ligadura dinámica, 165, 166, 168
ligadura estática, 166
F
final, 20, 86, 90, 129, 138, 139, 151,
M
173, 175, 178, 184 main, 105, 185
manejo de excepciones, 105
G mensaje, 20, 21, 23, 27, 28, 29, 34,
35, 40, 47, 54, 77, 86, 102, 103,
getClass(), 175, 176, 177, 178, 179 105, 106, 107, 108, 109, 111, 118,
126, 131, 132, 160, 161, 163, 166,
H 167, 168, 169, 171, 174, 175, 178,
179
heap, 56, 64, 65, 71
pcprogramasymas.com
herencia, 111, 112, 113, 114, 115, 40, 41, 73, 74, 78, 81, 82, 84, 86,
116, 118, 119, 120, 121, 122, 123, 87, 88, 90, 91, 93, 100, 102, 105,
125, 126, 127, 128, 137, 138, 147, 109, 110, 111, 115, 116, 117, 119,
152, 161 123, 124, 125, 127, 128, 130, 131,
132, 133, 138, 139, 141, 147, 151,
152, 160, 161, 166, 167, 168, 169,
I 175, 178, 179, 185, 187
identidad, 43, 44, 65, 83 modificador, 78, 83, 84, 86, 89, 90,
implements, 150, 162 110, 116, 125, 138, 139, 141
import, 92, 100 modularidad, 90
interface, 147
interfaz, 20, 145, 146, 147, 148, 150, N
151, 152, 156, 162, 163, 167, 168,
169, 179 new, 40, 41, 58, 65, 66, 67, 103, 105,
intérprete, 38 114, 124, 126, 146, 162, 163, 167,
168, 177
null, 13, 102, 103
J NullPointerException, 97, 102, 103,
Java, I, III, 5, 6, 10, 11, 25, 27, 28, 31, 104
32, 33, 38, 49, 51, 52, 69, 73, 83,
88, 94, 98, 102, 104, 114, 118, 121,
200
© Alfaomega - RC Libros JAVA. LA NOVELA
pcprogramasymas.com
114, 155 this, 108, 131, 132, 133, 134, 135
polimorfismo de mensajes, 163, 168 tipo dinámico, 166, 167, 168, 174
private, 80, 81, 85, 86, 87, 88, 89, 120, tipo estático, 166, 167, 174, 178
128, 134, 135, 139, 144 toString(), 109, 160, 161
protected, 88, 93, 116, 117, 125, 126
pseudovariable, 108, 131
public, 82, 84, 87, 88, 89, 92, 105,
V
108, 109, 116, 117, 118, 119, 124, valores primitivos, 57, 107, 114
125, 132, 134, 135, 138, 139, 141,
147, 150, 175, 185 84, 85, 86, 87, 88, 93, 102, 103,
puntero, 2, 3, 58, 59, 65, 66, 83, 84 105, 108, 109, 117, 126, 127, 130,
134, 145, 156, 160, 162, 163, 166,
R 167, 169, 175, 178
variable de clase, 86, 87
recolector de basura, 49, 50, 52, 58, Variable de instancia, 85
186, 187 visibilidad, 78, 88, 90, 116, 178
Redefinición, 115 void, 29, 33, 39, 84, 105, 108, 109,
reflexión, 175, 177, 179, 180, 184 119, 138, 147, 185
regla de compatibilidad de tipos, 126,
145, 156, 162
201