Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacion Orientada A Objeto - Nuria Medina Medina PDF
Programacion Orientada A Objeto - Nuria Medina Medina PDF
com
Programación Orientada a
Objetos con
“La novela”
Programación Orientada a
Objetos con
“La novela”
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
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
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
Prólogo
VII
NURIA MEDINA © Alfaomega - RC Libros
IX
NURIA MEDINA © Alfaomega - RC Libros
X
Guía didáctica
XI
NURIA MEDINA © Alfaomega - RC Libros
XII
1. Duda existencial
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
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
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
3
Una cuenta de ahorro es otro ejemplo de objeto
conceptual
11
NURIA MEDINA © Alfaomega - RC Libros
12
4. Cuestión de atributos
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
14
© Alfaomega - RC Libros JAVA. LA NOVELA
16
© Alfaomega - RC Libros JAVA. LA NOVELA
17
5. Responsabilidades
19
NURIA MEDINA © Alfaomega - RC Libros
20
© Alfaomega - RC Libros JAVA. LA NOVELA
7
objetoReceptor.mensaje(argumento1,
21
NURIA MEDINA © Alfaomega - RC Libros
22
6. Viaje astral
23
NURIA MEDINA © Alfaomega - RC Libros
24
© Alfaomega - RC Libros JAVA. LA NOVELA
25
NURIA MEDINA © Alfaomega - RC Libros
26
7. Mi forma de hacer las cosas
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
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
30
8. Curiosidades
31
NURIA MEDINA © Alfaomega - RC Libros
32
© Alfaomega - RC Libros JAVA. LA NOVELA
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
35
NURIA MEDINA © Alfaomega - RC Libros
36
9. Madre, matrona y alumbramiento
37
NURIA MEDINA © Alfaomega - RC Libros
38
© Alfaomega - RC Libros JAVA. LA NOVELA
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
42
© Alfaomega - RC Libros JAVA. LA NOVELA
44
© Alfaomega - RC Libros JAVA. LA NOVELA
47
NURIA MEDINA © Alfaomega - RC Libros
49
NURIA MEDINA © Alfaomega - RC Libros
50
© Alfaomega - RC Libros JAVA. LA NOVELA
51
NURIA MEDINA © Alfaomega - RC Libros
52
11. Ver mundo
—¿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.
—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
18
var1 = 3;
var2 = new EstudianteGradoInformatica(...);
19
int var1;
EstudianteGradoInformatica var2;
58
© Alfaomega - RC Libros JAVA. LA NOVELA
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
61
12. Helicóptero de viento
—¡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.
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
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
24
var = 3; // o
var=new EstudianteGradoInformatica(“Pedro”,...); //o
var=otraVariable;
66
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
27
ArrayList, LinkedList, TreeSet, HasMap... son
colecciones típicas en Java
69
NURIA MEDINA © Alfaomega - RC Libros
71
13. Amor a primera vista
72
© Alfaomega - RC Libros JAVA. LA NOVELA
28
getNombre(), getDireccion(), getFechaNacimiento()...
73
NURIA MEDINA © Alfaomega - RC Libros
75
NURIA MEDINA © Alfaomega - RC Libros
29
chica.getNombre();
30
chica.getFechaNacimiento();
76
© Alfaomega - RC Libros JAVA. LA NOVELA
77
NURIA MEDINA © Alfaomega - RC Libros
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
79
14. Detalles
32
private String nombre;
80
© Alfaomega - RC Libros JAVA. LA NOVELA
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
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
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
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
90
© Alfaomega - RC Libros JAVA. LA NOVELA
91
NURIA MEDINA © Alfaomega - RC Libros
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”
94
© Alfaomega - RC Libros JAVA. LA NOVELA
95
NURIA MEDINA © Alfaomega - RC Libros
96
© Alfaomega - RC Libros JAVA. LA NOVELA
98
© Alfaomega - RC Libros JAVA. LA NOVELA
100
© Alfaomega - RC Libros JAVA. LA NOVELA
101
16. El método perdido
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
104
© Alfaomega - RC Libros JAVA. LA NOVELA
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
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
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 */
...
}
...
}
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
ya nos vamos conociendo...
Me desarma la gesticulación y me concentro en su
explicación. ¿Qué remedio queda?
112
17. Herencia
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
56
public EstudianteGradoInformatica extends
EstudianteGrado {... cuerpo de la clase...}
118
© Alfaomega - RC Libros JAVA. LA NOVELA
57
public EstudianteGrado extends EstudianteUGR
{...cuerpo de la clase...}
58
public void addAsignaturaMatricula(Asignatura
nuevaAsignatura){
matricula.add(nuevaAsignatura);
}
119
NURIA MEDINA © Alfaomega - RC Libros
59
private List<Asignatura> matricula;
120
© Alfaomega - RC Libros JAVA. LA NOVELA
121
NURIA MEDINA © Alfaomega - RC Libros
122
© Alfaomega - RC Libros JAVA. LA NOVELA
123
NURIA MEDINA © Alfaomega - RC Libros
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
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
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
128
18. El árbol genealógico
129
NURIA MEDINA © Alfaomega - RC Libros
130
© Alfaomega - RC Libros JAVA. LA NOVELA
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
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
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
69
public final class String {...}
70
public final void metodoFinal(...){...}
138
© Alfaomega - RC Libros JAVA. LA NOVELA
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
140
© Alfaomega - RC Libros JAVA. LA NOVELA
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
78
Integer es una clase que sirve para envolver al tipo
primitivo int
149
NURIA MEDINA © Alfaomega - RC Libros
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
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.
—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?!
—¿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
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
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
80
abstract class FiguraGeometrica{...}
class Circulo extends FiguraGeometrica{...}
class Cuadrado extends FiguraGeometrica{...}
159
NURIA MEDINA © Alfaomega - RC Libros
160
© Alfaomega - RC Libros JAVA. LA NOVELA
81
System.out.println(“mensaje a imprimir por
pantalla”);
161
NURIA MEDINA © Alfaomega - RC Libros
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
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
164
21. Ligadura dinámica
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
170
22. Reflexiones
173
NURIA MEDINA © Alfaomega - RC Libros
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
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
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
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
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
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
184
© Alfaomega - RC Libros JAVA. LA NOVELA
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
187
NURIA MEDINA © Alfaomega - RC Libros
188
© Alfaomega - RC Libros JAVA. LA NOVELA
190
© Alfaomega - RC Libros JAVA. LA NOVELA
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
192
© Alfaomega - RC Libros JAVA. LA NOVELA
193
NURIA MEDINA © Alfaomega - RC Libros
194
© Alfaomega - RC Libros JAVA. LA NOVELA
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
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
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
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
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
201