Documentos de Académico
Documentos de Profesional
Documentos de Cultura
P03/75063/00959
FUOC • P03/75063/00959 2 El lenguaje Java
FUOC • P03/75063/00959 El lenguaje Java
Índice
Introducción .............................................................................................. 7
Objetivos ..................................................................................................... 8
1. Introducción ........................................................................................ 9
1.1. Origen del lenguaje .......................................................................... 9
1.2. Características del lenguaje ............................................................... 9
1.3. La máquina virtual Java (Java virtual machine) ................................. 10
1.4. The garbage collection (gestión automática de memoria) ................... 11
1.5. Seguridad en el código....................................................................... 12
1.5.1. La seguridad en Java. Resumen gráfico ................................. 14
2. Clases ...................................................................................................... 62
2.1. Definición con métodos ................................................................... 63
2.2. Estructura de una clase ..................................................................... 65
2.3. Sobrecarga de métodos ..................................................................... 67
FUOC • P03/75063/00959 El lenguaje Java
Solucionario ............................................................................................... 96
Introducción
Así, en este primer bloque trabajaréis los contenidos necesarios para poder uti-
lizar el lenguaje Java en el desarrollo de pequeños programas que interaccio-
nan con el usuario.
Objetivos
2. Obtener los códigos objeto a partir de los códigos fuente, utilizando las
herramientas que proporciona el entorno de desarrollo.
3. Obtener los códigos ejecutables a partir de los códigos objeto, con la uti-
litzación de librerías, utilidades y recursos.
5. Conocer y utilizar la sintaxis del lenguaje Java, en relación con los tipos
de datos existentes y también con los operadores, sentencias condiciona-
les y bucles.
10. Conocer la sintaxis básica en Java de los elementos que permiten el uso
de la filosofía de programación orientada al objeto.
1. Introducción
Existen distintas versiones del origen del lenguaje Java, pero la más extendida
es la siguiente:
En 1991 James Goslingn, el creador de Java, llamó a este lenguaje OAK, porque
desde la ventana de su oficina de Sun Microsystems podía contemplar un gran
roble (oak, en inglés) .
Más tarde, el equipo de desarrollo de Java descubrió que Oak era el nombre de
otro lenguaje de programación y que, por lo tanto, era necesario encontrar otro.
Mientras se encontraban en una cafatería pensaron en llamarlo Java, que en Es-
tados Unidos es una forma coloquial de referirse al café. Esta es la explicación
del símbolo de Java: una taza de café humeante.
Los applets son programas escritos en Java cuyo código se encuentra en los servidores web.
Se descargan mediante un navegador en el sistema cliente y son ejecutados por el navegador.
Normalmente los applets son de tamaño reducido con el fin de minimizar el tiempo de des-
carga y se llaman a partir de páginas HTML (hypertext markup language).
FUOC • P03/75063/00959 10 El lenguaje Java
Las aplicaciones Java son programas independientes que no precisan navegador para
ejecutarse. Son programas de propósito general que pueden ejecutarse en cualquier má-
quina con un entorno de ejecución de Java instalado.
Para resolver el problema que puede representar el hecho de que cada ordenador entienda
el código máquina de un modo distinto, Java introduce un nivel entre el programa eje-
cutable y el código máquina. Para hacerlo, Java introduce los conceptos de bytecodes y má-
quina virtual Java, que estudiaremos a continuación.
La Java virtual machine specification define del siguiente modo la máquina vir-
Java virtual machine
tual de Java (JVM): specification...
La máquina virtual Java es un programa que toma los ceros y unos represen-
tados en bytecodes, los traduce a código máquina y los ejectua en un ordenador
determinado. La JVM depende del tipo de ordenador; por lo tanto, existe una
para cada tipo de ordenador y no son compatibles entre sí.
Cualquier intérprete que sea compatible con la tecnología Java debe ser capaz
de ejecutar cualquier programa con archivos de clases que respeten el formato de
archivo de clase definido en la Java virtual machine specification.
No hay que confundir la JVM con un intérprete de un lenguaje de alto nivel: la entrada
de la máquina virtual son bytecodes y la salida, código máquina; la entrada de un intér-
prete son instrucciones del lenguaje, y la salida, código máquina.
La JVM es una pequeña CPU emulada que toma los bytecodes compilados en Java y los
transforma en código máquina: es un ordenador dentro de nuestro ordenador (de ahí su
nombre). Esto conlleva ventajas evidentes: los programas son totalmente portátiles, el ries-
go de que el ordenador se cuelgue es nulo, y el ordenador no puede ser infectado por nin-
gún virus, puesto que de la JVM no puede salir nada que sea perjudicial para el sistema.
integridad del sistema. Cuando se han superado estos tests, podemos estar
seguros de los siguientes aspectos:
Aunque es muy difícil, es posible desarrollar un compilador para generar bytecodes que
puedan saltarse las especificaciones de seguridad introducidas en el ámbito del lenguaje.
Entonces, podría lanzar un conjunto de bytecodes que enmascararan operaciones peligro-
sas para el sistema. Para evitarlo, la JVM verifica los bytecodes antes de ejecutarlos: analiza
su formato y comprueba que no existen punteros y el acceso a los recursos del sistema
mediante los objetos de Java, entre otros.
Este proceso de verificación implica que la ejecución sea más lenta, pero cuando se han
garantizado los puntos anteriores, la JVM funciona mucho más rápido.
Antes de hablar de Java como lenguaje seguro, es preciso tener en cuenta que
la seguridad de un sistema es inversamente proporcional a su grado de apertu-
ra: no puede existir un sistema completamente seguro y abierto a todo el mun-
do. Java es un lenguaje abierto a todo el mundo que permite la ejecución de
programas muy distintos con la incorporación –mediante Internet– de clases
que pueden hallarse a miles de quilómetros de distancia y de las que no cono-
cemos su autor. La seguridad que proporciona Java está en el hecho de que
ejectua los programas en la JVM, de la que es muy difícil salir.
Lo primero que hay que saber para programar en Java es que cualquier progra-
ma, independientemente de su simplicidad, tiene los siguientes elementos:
import ....
public class Programa {
public static void main (String args[ ]) {
// cuerpo del programa
}
}
Cualquier programa que creemos será una clase (class) con una serie de variables
que se inicializarán (atributos) y procedimientos y funciones (métodos).
* Podemos encontrar programas
que no contengan la sentencia
Cualquier programa deberá trebajar con métodos propios de la librería que import, porque existen métodos
que el compilador ya sabe donde
debe ir a buscar directamente, y no
proporciona Java (API) y, por lo tanto, deberá importarlos con la sentencia será preciso utilizarla.
import*.
Podemos encontrar el nombre args con las formas argv, params, etc., aunque,
por convención, se utiliza generalmente args o argv.
La definición String args[ ], o lo que es lo mismo, String[ ] args, sirve para alma-
cenar los parámetros que siguen a la ejecución del programa.
Ejemplo
Nota
Tenemos el siguient programa:
Podemos saber cuántos pará-
public class Prueba (String args[]) { metros se han intorducido
// cuerpo del programa consultando args.length.
} Si el resultado es 0, significará
que no se ha introducido nin-
Lo primero que hay que hacer es compilar el programa con la sentencia javac prueba.java. gún parámetro. El resultado
de consultar args.length en
Como resultado de la compilación, se habrá creado un archivo prueba.class que ya puede
el ejemplo anterior es 3 porque
ser ejecutado por el intérprete de Java del siguiente modo: se han introducido tres pará-
metros.
java Prueba Observad que args se inicializa
con el índice 0.
Si hacemos:
y así sucesivamente.
FUOC • P03/75063/00959 17 El lenguaje Java
Así, pues, puede accederse a los parámetros entrados por la línea de instruccio-
nes. Estos parámetros pueden ser números enteros, reales, caracteres, etc., y siem-
pre se leerán como strings. La conversión correspondiente (de String a entero, a
real, etc.) se realiza dentro del programa.
En el apartado “Entrada/salida en
Java” de este mismo módulo
didáctico se presentan otras formas
de introducir datos en un programa.
Ejemplo
El programa siguiente toma dos números entrados por la línea de instrucciones y los suma:
El programa siguiente escribe las letras que se han entrado por la línea de comandos en
sentido contrario:
public –Indica que el método main() es de acceso público para todo el mundo, incluido el Las palabras reservadas public,
static, void y class se analizan
intérprete de Java. en profundidad en la segunda parte
static –Indica al compilador que el método main() es el primero que debe ejecutarse. de este módulo didáctico.
void –Indica que el método a que se refiere no devuelve ningún parámetro.
class –Significa ‘clase’. Cualquier programa en Java es una clase.
Existen tres formas de introducir comentarios en un programa de Java: Los comentarios de documentación
son generados por la instrucción
javadoc, que se explica en el apartado
“La generación de la documentación”.
• // comentario en una línea
• /* comentario en una o más líneas */
• /** comentario de documentación */
En éste, #include pasa a ser import, que no incluye ningún archivo, sino que in-
Trataremos los paquetes en el
dica dónde se encuentra el paquete (package) con las clases que nos interesan. apartado “Métodos predefinidos: el
API”, de este mismo módulo didáctico.
3. Instalación de Java
javac NombrePrograma.java
• -g: indica al compilador que genere tablas de depuración para facilitar in-
formación al depurador.
• -verbose: muestra mensajes sobre los archivos que se compilan y los que
se cargan.
Ejemplo
javac NombrePrograma.java
FUOC • P03/75063/00959 20 El lenguaje Java
Si se da algún error compilando la aplicación, aparecerá un mensaje por pantalla del error
producido, que deberá solucionarse. Por ejemplo:
Este error se debe a que se han olvidado las palabras static o public en la línea que contiene
la declaración del método main.
Las opciones disponibles para todas las plataformas son las siguientes:
Uno de los grandes cambios que presenta el javadoc 1.2 es que el formato de
la documentación que saldrá está definido en unas clases especiales, los
doclets.
JDK (Java development kit) proporciona un doclet que genera documentación en formato
HTML, pero pueden definirse doclets que generen documentaciones en formato XML,
SGML, RTF y MIF.
• -sourcepath path: especifica donde hay que buscar los archivos fuente.
• -docencoding name: especifica el nombre codificado del archivo HTML Volveremos sobre esta opción
en la segunda parte de este módulo
generado. didáctico.
Los tipos simples que permite declarar Java son los siguientes:
• Tipos enteros
Ejemplos
float z = 3.1416f;
Se dice que una constante es en punto o coma flotante si incluye un punto
double w = 3.1416;
decimal, una parte exponencial (indicada por la letra E o e) o si va seguida de
la letra F o f (float) o de la letra D o d (double).
En otros lenguajes...
Ejemplos:
... el volumen y el formato de los
3,14: número real simple (double) tipos de datos primitivos puede
6.02E23: número real grande depender de la plataforma don-
2.718F: valor real de volumen float de se ejecuta el programa. En Ja-
va, el lenguaje especifica el
Ejemplos de asignaciones incorrectas: volumen y el formato de los ti-
pos de datos primitivos y, por lo
tanto, el programador no debe
i = 3,1416; // 3,1416 no es un entero preocuparse de las dependen-
w = 175,0000; // No es una coma, sino un punto cias del sistema.
z = 3,1416; // Un double no cabe en un float
FUOC • P03/75063/00959 24 El lenguaje Java
• Caracteres
Ejemplos:
char ch = ’a’;
char ch2 = ’\t’; // Un tabulador
• Booleano
Ejemplo
int i = 1;
if (i) // Error de compilación
if (i! = 0) // Correcto
Por convención, en Java el nombre de las variables empieza por una letra mi-
núscula. Si un nombre de variable tiene más de una palabra, éstas se unen y
cada una, menos la primera, empieza con una letra mayúscula (isVisible ). En
los nombres de clase, en cambio, todas las palabras empiezan con mayúscula.
Para declarar una variable como final, se utiliza la palabra reservada final de-
lante del tipo.
Ejemplo
Ejemplo
int a = 2;
byte b;
b = (byte) a;
(datatype) expression
donde datatype es el nuevo tipo como deseamos que se trate el valor de la expresión.
Ejemplo
Si tenenos un int y queremos tratarlo como un double, no es necesario realizar una con-
versión de tipos porque un double contiene todo el rango de valorse del int.
int i = 2;
double d = i;
double d = 2.0;
int i = (int) d;
Las variables pueden convertirse automáticamente cuando no se pierde infor- La conversión de tipos también es
precisa en el trabajo con objetos,
como en la segunda parte de este
mación en la conversión. módulo didáctico.
Ejemplo
A diferencia de otros lenguajes, Java contiene otros tipos especificados en las En Java también hay los tipos
de referencia (arrays, clases
clases que se incluyen en el JDK; como la clase String que, en realidad, no es e interfaces).
Los arrays se estudian en el apartado
“Arrays y vectores”, y las clases y las
un tipo, sino una clase que se utiliza en los programas, que facilita la progra- interfaces, en la segunda parte de este
módulo didáctico.
mación aportando métodos preexistentes que permitirán, por ejemplo, calcu-
lar automáticamente la longitud de una cadena o modificar el contenido del
carácter i-ésimo de una cadena por otro carácter, pero puede utilizarse como
un tipo básico en muchos aspectos.
Las cadenas serán el tipo de datos que utilizaremos para comunicar nuestras
aplicaciones con los dispositivos de lectura y escritura de datos: el teclado y la
pantalla.
Ejemplo
String prueba;
FUOC • P03/75063/00959 27 El lenguaje Java
cad = "cadena";
System.out.println(cad);
• Concatenar strings.
.append(num)
.append("hermanos")
.toString();
Ejemplo
Supongamos que tenemos una variable x de tipo int, cuyo valor es 5.
Después de hacer
prueba = "El valor de x es " + x;
En esta asignación, se interpreta que el resultado final debe ser un String. Por ello, ope-
rando x de la concatenación se convierte implícitamente a String.
Ejemplo
Ejemplo
• Comparar strings
Ejemplo
String s1 = "Hola";
String s2 = "Hola";
int x;
if (s1 == s2) x = 1; else x = 2;
Ejemplos
Se lleva a cabo mediante compareTo, que devuelve un número que puede ser
el siguiente:
Ejemplo
• Buscar caracteres
Ejemplos
"Jaba".replace('b','v') "Java"
FUOC • P03/75063/00959 30 El lenguaje Java
Para establecer la longitud exacta del valor String en un buffer, se utiliza la senten-
cia setLength(nuevaLongitud).
Los literales true, false y null es escriben con minúscula, y no con mayúscula como en el
lenguaje C++.
goto y const son palabras reservadas que no tienen ninguna aplicación en el lenguaje Java.
FUOC • P03/75063/00959 32 El lenguaje Java
5. Operadores en Java
• Operadores aritméticos
• Operadores lógicos
– Operadores de bit
– Operadores lógicos booleanos
• Operadores relacionales
...
int a,b;
a = 3;
b = 6;
suma = a+b; resta = a-b; multip = a*b; divent = a/b;
System.out.println("La suma es" + suma);
System.out.println("La resta es" + resta);
System.out.println("La multiplicacion es" + multip);
System.out.println("La division entera es" + divent);
if (a%2 == 0) System.out.println("El numero es par");
a++;
b--;
...
Al utilizar el operador suma, hay que tener presente que, cuando los dos ope-
randos son de tipo numérico y primitivo, el resultado es, al menos, un int y
tiene como valor el calculado después de convertir los dos operandos al tipo
FUOC • P03/75063/00959 33 El lenguaje Java
Ejemplo
short a, b, c;
a = 1;
b = 2;
c = a+b;
// Error !!!
c = (short)(a + b);
// Correcto
Operador Resultado
| OR de bit
^ OR exclusivo de bit
|= OR de bit y asignación
Ejemplo
Decimos que dos operadores están en cortocircuito cuando el primero ya decide el resul-
tado. En este caso, Java no consulta el segundo operando.
FUOC • P03/75063/00959 34 El lenguaje Java
Ejemplo
cierto OR cierto =
Operador Resultado
|| OR lógico
^ XOR lógico
== igual a
!= distinto de
Ejemplos
...
int a,b;
...
if ((a>0)&&(a<10)) System.out.println("El número está entre 0 y 10");
else if ((a < 0) || (a == 0))
System.out.println("El número está en el lado de los negativos");
....
if (b! = 0) System.out.println("Número distinto de 0");
...
>= op1 >= op2 Cierto si op1 es mayor o igual que op2.
<= op1 <= op2 Cierto si op1 es menor o igual que op2.
5.4. Equivalencias
6. Los condicionales
Ejemplo 1
...
char c
...
if ((c >= 'A')&&(c <= 'Z')) return true;
else return false;
...
Ejemplo 2
...
if ((args.length > 2)||(args.length < 2))
System.out.println("Error: debes introducir dos números.");
else
nombre1 = Integer.parseInt(args[0]);
...
Ejemplo
...
if (args.length == 1) System.out.println("Procesando...\n");
else{
System.out.println("Error en el número de parámetros...\n");
System.exit(0);
}
...
int abc = 1;
if (abc) // Genera un error de compilación
if (abc != 0) // Correcto
Tiene el mismo formato que en el lenguaje C. Puede utilizarse tipo byte, char,
short, int o long como valores en el case y hay que tenen siempre la opción de
default.
switch(expresión) {
case valor1: sentenciasAEjecutar;
break; // si no se pone, también ejecutaría las sentencias de
// valor2 y siguientes
case valor2: sentenciasAEjecutar;
break;
default: sentenciasAEjecutar; // si no es ninguno de los
// valores, qué hay que hacer
}
Ejemplo
...
numeroi = argv[0];
basei = Integer.parseInt(argv[1]);
switch(basei) {
case 2: {numero10 = Integer.parseInt(numeroi,2);break;}
case 8: {numero10 = Integer.parseInt(numeroi,8);break;}
case 10: {numero10 = Integer.parseInt(numeroi,10);break;}
case 16: {numero10 = Integer.parseInt(numeroi,16);break;}
default: break;
}
…
FUOC • P03/75063/00959 38 El lenguaje Java
7. Los bucles
Ejemplo 1
Ejemplo 2
...
int i = 100;
int suma = 0;
while (i <= 200) {
suma = suma + i;
i = i + 2;
}
...
do {
FUOC • P03/75063/00959 40 El lenguaje Java
sentencia1;
sentencia2;
...
} while (expresión);
Ejemplo
...
int i = 100;
int suma = 0;
do {
suma = suma + i;
i = i + 2;
} while (i <= 200);
...
• break[etiqueta]
Se utiliza para salir de las sentencias switch, los bucles y las etiquetas.
• continue[etiqueta]
• etiqueta: sentencia
...
saltar: while(true) {
for (int i = 0; i < 100; i++) {
switch (c = System.in.read()) {
case –1:
case ’\n’:
break saltar;
...
}
Ejemplo
text = args[0];
char c;
int contador = 0;
int i = 0;
while (i < texto.length()) {
c = texto.charAt(i);
if (esMayuscula(c)) {
contador++;
}
i++;
}
System.out.println("El total de letras mayúsculas es: " + contador);
}
}
FUOC • P03/75063/00959 43 El lenguaje Java
El API incluye, entre otros, una descripción de los distintos paquetes que in-
corpora el JDK.
El API no es un manual, sino una descripción de lo que podemos encontrar en los dis-
tintos paquetes que nos ofrece. Esto puede parecer poco útil, però hay que tener en cuen-
ta que cuando ya se conocen los mínimos del lenguaje de programación Java y se
pretende utilizar las rutinas del API, normalmente surgen dudas (¿cómo se llama un mé-
todo determinado?, ¿cuál es la cantidad de parámetros necesarios para llamar un método
determinado?). En este momento es cuando se agradece la presencia del JDK, puesto que
proporciona información puntual adecuada para resolver este tipo de problemas.
Los paquetes de Java son los archivos en los que se agrupan clases –con sus
correspondientes métodos– según su función.
java.nombreDelPaquete
Pueden crearse paquetes personales que agrupen las mejores clases creadas con
Los paquetes
vista a futuros programas.
No es necesario que un paque-
te se encuentre en Internet
Antes de crear una clase nueva es preciso comprobar que no existe. Hay que tener en para poder utilizarlo.
cuenta que las clases predefinidas de Java cubren una amplia gama de funciones.
Alguno de los paquetes básicos que se incluyen en la versión JDK de Java son
los siguientes:
• java.net: apoya las comunicaciones TCP/IP. Incluye las clases que se refie-
ren a la comunicación en red.
• java.awt: contiene las clases y los métodos del Abstract Windows Toolkit,
Los paquetes de Java
independientes del sistema, para el manejo de la interfaz de usuario.
Además de los citados paque-
tes, hay otros, como el JDBC
• java.awt.image: contiene clases y métodos independientes del sistema, (no incluido en el JDK). Este pa-
necesarios para el manejo de gráficos e imágenes. quete se utiliza para manejar
bases de datos -java.sql.
• Leer la descripción de los paquetes. Los paquetes tienen una descripción que
explica para qué sirven y, además, están distribuidos de forma coherente.
FUOC • P03/75063/00959 45 El lenguaje Java
• Buscar en el índice palabras que tengan similitud con lo que deseamos hacer.
Por ejemplo, por cuestiones relacionadas con cálculos matemáticos buscaría-
mos la palabra math.
• Package. Al hacer clic sobre esta opción, obtendremos una lista de las cla- Las opciones se presentan
en el marco superior derecho
ses e interfaces de cada paquete, junto a una breve descripción. Los paque- de la página.
tes pueden contener cuatro tipos de categorías:
• NombrePackage
• Class NombreClase
• Diagrama de herencia de la clase
• Subclases
• Subinterfaces
• Implementaciones
• Declaración de la clase
• Descripción de la clase
• Resumen de la clase
• Resumen de los campos
• Resumen de los constructores
• Resumen de métodos
• Detalle de los campos
• Detalle de los constructores
• Detalle de los métodos
Cada paquete, clase o interfaz tiene su página de uso (use), que indica los pa-
Accesibilidad
quetes, las clases, los métodos, los constructores y los atributos que emplea.
A esta opción sólo se tiene ac-
ceso desde un paquete, desde
una clase o desde una interfaz.
Cada página de jerarquía de clases (tree) contiene una lista de clases y una de
interfaces.
8.2.7. El índice
8.2.8. La ayuda
Por ejemplo, la función suma tiene dos parámetros de entrada (el operando 1
y el operando 2) enteros y retorna otro entero (la suma de ambos operandos).
La signatura de la función suma sería la siguiente:
Ejercicio
Analizad qué ocurre con la aplicación de los métodos siguientes sobre este string:
String sT1 = "Ejercio 1"
• String mayus = st1.toUpperCase();
• String minus = st1.toLowerCase();
• int longitud = st1.length();
• char caracter = st1.charAt(1);
• tring sub = st1.substring(3,5);
S
Ejemplo
>java Suma 12 5
La suma de 12 y 5 es 17
>
El vector args de la función main (programa principal) recoge todos los strings
que añadimos tras el nombre del programa. De este modo, args[0] contiene el
primer String, args[1], el segundo, etc. Sin embargo, con este mecanismo es ne-
cesario garantizar que el programa no accederá a más argumentos de los espe-
cificados en la línea de instrucciones.
Ejemplo
strings. No hay que preocuparse por el significado exacto de las sentencias que
se explicarán, sólo es necesario saber que nos permitirán leer datos que poste-
riormente podremos utilizar en nuestros programas.
Ejemplo
import java.io.*;
int x;
int y;
int sum;
// Primero identificamos el
// dispositivo de entrada de datos (teclado)
in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Entra el primer número: ");
s = in.readLine();
x = Integer.parseInt(s);
System.out.print("Entra el segundo número: ");
y = Integer.parseInt(in.readLine());
sum = x + y;
System.out.println("La suma de " + x + " y " + y + " es " + sum);
}
}
Las sentencias:
s = in.readLine();
x = Integer.parseInt(s);
y = Integer.parseInt(in.readLine());
Durante la ejecución del programa anterior, se apreciaría esta interacción con el usuario:
System.out.println(s);
En esta sentencia s es una expresión de tipo String. Como se ha visto con la manipulación
de strings, esta expresión puede incluir operandos de otros tipos que serán convertidos
implícitamente en strings . La sentencia anterior escribe el String por pantalla y añade un
salto de línea.
Ejemplo
Ejemplo
import java.io.*;
class Entra2 {
public static void main(String[] args) throws IOException {
PrintStream printer = new PrintStream (new FileOutputStream("abc.txt"));
printer.print("Dos + " + 2);
printer.println("=" + (2 + 2));
printer.close();
}
}
Ejemplo
import java.io.*;
class Entra3 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader (new FileReader("abc.txt"));
String str = reader.readLine();
System.out.println(str);
reader.close();
}
FUOC • P03/75063/00959 52 El lenguaje Java
Los arrays, las clases y las interfaces son tipos de referencia. El valor de una va-
Una comparación
riable de referencia, al contrario de los tipos primitivos, es una referencia al va-
lor actual o al conjunto de valores representados por la variable. Una referencia sería el equiva-
lente a la dirección de un
amigo. La dirección no es pro-
piamente el amigo, sino una
forma de llegar a él.
Una variable de referencia no es el array u objeto, sino la dirección que
nos conduce a él.
class java.lang.Object
o class java.util.AbstractCollection (implements java.util.Collection)
o class java.util.AbstractList (implements java.util.List)
o class java.util.AbstractSequentialList
o class java.util.LinkedList (implements
java.lang.Cloneable, java.util.List, java.io.Serializable)
o class java.util.Arraylist (implements java.lang.Cloneable,
java.util.List, java.io.Serializable)
o class java.util.Vector (implements java.lang.Cloneable,
java.util.List, java.io.Serializable)
o class java.util.Stack
o class java.util.AbstractSet (implements java.util.Set)
o class java.util.HashSet (implements java.lang.Cloneable,
java.io.Serializable, java.util.Set)
o class java.util.TreeSet (implements java.lang.Cloneable,
java.io.Serializable, java.util.SortedSet)
Vector y ArrayList…
Muchas de estas clases (como TreeSet o LinkedList) son muy específicas y que- ... son almacenes de objetos
dan fuera de los objetivos del curso. Vector es muy popular porque ya existía que nos permiten acceder
a los elementos que contienen
en las versiones anteriors al JDK 1.2. ArrayList ha aparecido con la versión 1.2, de formas distintas. Por ejem-
plo, podemos acceder a un ele-
però parece que acabará siendo tan popular como Vector. mento refiriéndonos a su
posición dentro de la colec-
ción, realizar una búsqueda
de un determinado elemento
En la documentación del JDK (en el paquete java.util) podéis encontrar más para ver si se encuentra
en la colección, etc.
información sobre estas dos clases.
FUOC • P03/75063/00959 53 El lenguaje Java
Las principales diferencias que existen entre array y Vector son las siguientes:
• No hay métodos de array para trabajar con los arrays o con sus elementos;
el lenguaje proporciona símbolos especiales que nos permiten acceder a los
elementos de los arrays.
• Los arrays tienen un campo llamado length que indica el número de ele-
mentos del array. Los vectores deben utilizar el método size para dar esta
información.
• Los elementos del array pueden contener tipos de datos primitivos (como
por ejemplo los enteros) y referencias de objetos.
• Los arrays no pueden crecer. Una vez se han creado, tienen una cantidad
de elementos fija.
Si comparamos los arrays con los vectores, en cuanto al uso, podemos estable-
cer la siguiente tabla de ventajas e inconvenientes:
Ventajas Inconvenientes
* Un código que utilice arrays será
más rápido que un código que
Tienen unas dimensiones fijas, no pueden emplee vectores.
Permiten almacenar tipos primitivos.
crecer. Sin embargo, la búsqueda binaria
en un Vector seguirá siendo mucho
Puede accederse a sus elementos sin enviar Ofrecen un conjunto de operaciones más más rápida que la búsqueda
un mensaje*. limitado. secuencial en un array.
FUOC • P03/75063/00959 54 El lenguaje Java
array a Vector v
Establecido para la
Tipos de elementos Referencia de objeto
declaración de a
¿Cómo se denota la
a[índice] v.elementAt(índice)
referencia de un elemento?
¿Puede crecer
No Sí
dinámicamente?
Con el fin de declarar una variable que referencie un array, se escribe el tipo
de todos los elementos, seguido por un par de corchetes vacíos y el nombre de
la variable de referencia.
Ejemplo
Para crear un array se emplea el operador new, seguido por el tipo de elementos
y un entero entre corchetes. Este entero especifica el número de elementos que
tendrá el array.
Ejemplo
Para crear un array de enteros, primero es preciso declarar una variable de re-
ferencia array y, después, se crea un array formado por seis enteros y se hace
que la variable anterior referencie el nuevo array.
es equivalente a:
String nombre[ ];
nombre = new String[3];
nombre[0]="Pepi";
nombre[1]="Sara";
nombre[2]="Mar";
El siguiente programa lee e imprime una lista de cien enteros, uno por línea
en ambos sentidos.
import java.io.*;
import java.lang.*;
class EnteroAlReves {
public static void main(String[] a) throws Exception {
BufferedReader teclat = new BufferedReader(new
InputStreamReader(System.in));
int[] z = new int[10];
int i = 0;
while (i != 10) {
z[i] = Integer.parseInt(teclat.readLine());
i++;
}
int k = 9;
System.out.println("El resultado es:");
while (k != -1) {
System.out.println(z[k]);
--k;
}
}
}
Vector es una clase que permite almacenar objetos de cualquier tipo (trabaja
con la clase Object, por lo tanto, puede almacenar cualquier subclase de Object).
Su representación gráfica de vector es la siguiente:
Vector(inicial, incremento)
v.add("A");
v.add("B");
v.add("C");
Ejemplo
v.indexOf("B");
Esta función devolvería como respuesta 1. La posición 1 es la que almacena el String "B".
Ejemplo
v.get(1);
Ejemplo
Más información
for (java.util.Iterator i = v.iterator() ; i.hasNext() ;) {
System.out.println(i.next().toString()); También existe toda una jerar-
} quía de iteradores que nos
ofrecen varias funcionalidades.
o bien Si deseáis más información,
podéis consultar el JDK
for (java.util.Iterator i = v.listIterator() ; i.hasNext() ;) { (en el paquete java.util).
System.out.println(i.next().toString());
}
Para trabajar con Vector es necesario hacer un import del paquete java.util,
o directamente de la clase java.util.Vector.
FUOC • P03/75063/00959 57 El lenguaje Java
En la primera parte de este módulo, hemos utilizado los tipos primitivos de Java
(numérico, carácter y lógico), junto con otros tipos que representaban almace-
nes de información, como las cadenas de caracteres, los vectores y los arrays.
Recordemos que, en Java, todos los tipos que no sean primitivos (int, long, double,
short, char, boolean y byte) son tipos de referencia.
Una variable que representa un tipo primitivo almacena el valor de este tipo, mientras
que una variable que representa un tipo de referencia sólo almacena una referencia a la
localización en memòria de este objeto.
Si por cualquier motivo es preciso tener referencias de los tipos primitivos int
o double, el propio lenguaje define las clases Integer y Double.
Ejemplo
Supongamos que deseamos crear un objeto de tipo Panel (la clase Panel sirve en Java para
llevar a cabo la gestión de interfaces):
Ejemplo
Tomamos una clase predeterminada en Java, como la del ejemplo anterior (Panel) y la cla-
se Button*. * La clase Button permite
la creación, dentro de un Panel,
de los típicos botones de aceptar
... y cancelar.
Panel p = new Panel();
// Creación del panel
Button b = new Button();
// Creación del botón
b.setLabel("Aceptar"); // Llama al método setLabel de la clase
// Button, que permite crear un botón con el nombre el nombre que se
// le introduce como parámetro p.add(b);
// Se añade el botón al panel utilizando el
// método add de la clase Panel, que permite añadir Las clases Panel y Button se incluyen
// al panel aquello que se introduce como parámetro en el paquete java.awt.
...
...
Button b = new Button("Aceptar");
...
FUOC • P03/75063/00959 59 El lenguaje Java
1.3. La asignación
Cuando se utiliza la asignación es preciso tener cuidado para no perder refe- Se ha perdido la referencia
del objeto “dos” porque ambas
rencias a objetos que después puedan necesitarse. variables referencian el mismo
objeto.
Ejemplo
...
Button uno = new Button("Aceptar");
Button dos = new Button("Cancelar");
dos = uno; // Copia la referencia. Ahora, dos referencia adonde
// referenciaba uno
...
Al hablar de los tipos primitivos, vimos que el operador == permite saber si los
valores de las variables que se comparan son iguales o no. En la orientación al
objeto, el operador == retorna cierto si las referencias de ambos objetos son
iguals, y falso en el caso contrario. Para poder comparar correctamente los con-
tenidos de los objetos, es necesario emplear el método equals.
Ejemplo
...
Objeto uno = new Objeto();
Objeto dos = new Objeto();
if un.equals(dos) then System.out.println("Son iguales")
else System.out.println("Son distintos");
...
Ejemplo
...
Objeto uno = new Objeto();
Objeto dos = un.clone();
...
FUOC • P03/75063/00959 60 El lenguaje Java
En Java, el paso de parámetros siempre es por valor. Esto significa que cuando
el parámetro de cierto método es un objeto representado mediante una refe-
rencia, el valor que se transmite al método es la referencia a la zona de memo-
ria en que se encuentra el objeto.
Ejemplo 1
P.java
class P {
static void f(int i) {
System.out.println(++i);
}
Ejemplo 2
P1.java
class CuentaBancaria {
long numero;
String titular;
long saldo;
}
class P1 {
static void arruinar(CuentaBancaria c) {
c.saldo = 0;
c = null;
}
Ejemplo 3
P2.java
class P2 {
static void f(int x[]) {
x[3] = 0;
FUOC • P03/75063/00959 61 El lenguaje Java
x = new int[8];
x[3] = 5;
}
2. Clases
class Triangulo {
double base;
double altura;
} // final de la clase
PruebaTriangulo.java
class Triangulo {
double base;
double altura;
}
class PruebaTriangulo { Mediante el operador new, se crea
public static void main(String[] args) { el nuevo objeto, mientras que la
referencia de cada una de las
Triangulo t1 = new Triangulo(); variables de instancia del objeto se
Triangulo t2 = new Triangulo(); lleva a cabo con el operador punto.
t1.base = 7;
t1.altura = 8;
t2.base = 8;
t2.altura = 10;
System.out.println("Área triángulo 1:" + ((t1.base * t1.altura) / 2));
}
}
(t1.base ∗ t1.altura)/2
En el ejemplo
Desde el punto de vista de la programación orientada a objetos, un nue- del triángulo,...
vo objeto queda definido por una estructura de datos que lo soporte, un ... los atributos base y altura
son la estructura del objeto, y
estado, o valor, del objeto en cada instante y un conjunto de métodos el valor del objeto en cada ins-
para manipularlo. tante es el valor de los compo-
nentes base y altura.
class Triangulo {
private double base;
private double altura;
public Triangulo() { }
public double area() {
return(base * altura / 2)
}
public double getBase() {
return(base);
}
public double getAltura() {
return(altura);
}
public void setBase(double bas) {
base = bas;
}
public void setAltura(double al) {
altura = al;
}
}
FUOC • P03/75063/00959 64 El lenguaje Java
• En cualquier método existe por defecto (y, por lo tanto, puede declararse o
En el ejemplo…
no) un método sin tipos con el nombre de la propia clase.
… es el método Triangulo(),
que se utiliza para crear nuevos
Los métodos pueden clasificarse, según su función, del modo siguiente: objetos de la clase mediante el
operador new.
Ejemplo
PruebaTriangulo2.java
class Triangulo2 {
private double base;
private double altura;
public Triangulo2() {
}
public double area() {
return ((base * altura) / 2);
}
public double getBase() {
return (base);
}
public double getAltura() {
return (altura);
}
public void setBase(double bas) {
base = bas;
}
FUOC • P03/75063/00959 65 El lenguaje Java
Recordemos lo siguiente:
• El tipo de valor void indica que el método no retorna ningún valor. Las fun-
ciones retornan su valor gracias a la palabra reservada return.
Java permite que distintos métodos dentro de una clase se llamen igual,
siempre y cuando sus listas de parámetros sean diferentes. Esto se deno-
mina sobrecarga de métodos.
La sobrecarga permite al programador utilizar el mismo nombre para dos métodos dife-
rentes. El que invoca al método especifica implícitamente qué método se invocará me-
diante la lista de argumentos que se pasa en el mensaje, y que entonces se compara con
los prototipos de los diferentes métodos candidatos hasta encontrar una coincidencia. La
determinación de cuál es el método correcto se lleva a cabo en tiempo de compilación.
Hay que tener presente que en la definición de la clase Triangulo del apartado
“Definición con objetos”, se incluye un constructor Triangulo() que sólo crea
el objeto (por ello, no está definido el cuerpo del constructor), y dos métodos
(setBase y setAltura) para asignar valores a las variables de instancia de los ob-
jetos.
class Triangulo {
private double base;
private double altura;
En este ejemplo se incluyen tres métodos constructores, que se llaman igual pero que
cuentan con un número de parámetros diferente:
MasPrueba.java
class Triangulo3 {
private double base;
private double altura;
class MasPrueba {
public static void main(String[] args) {
Triangulo3 t1 = new Triangulo3();
Triangulo3 t2 = new Triangulo3(2.5, 3.5);
Triangulo3 t3 = new Triangulo3(34.2);
}
}
FUOC • P03/75063/00959 69 El lenguaje Java
Otro ejemplo:
Sumar.java
return a + b;
}
public static int suma(int a, int b) {
System.out.println("Suma de enteros");
return a + b;
}
Rectangulo2.java
public Rectangulo2() {
x1 = 0;
x2 = 0;
y1 = 1;
y2 = 1;
}
El lenguaje Java incluye una referencia especial llamada this, utilizada en cual-
quier método para referenciar el objete actual. El valor this se refiere al objeto
sobre el que se ha llamado el método actual.
Ejemplo
En este ejemplo, la referencia this
indica el objeto en curso, y ello
Triangulo4.java permite resolver la ambigüedad
referente a los nombres
de los parámetros.
class Triangulo4 {
private double base;
private double altura;
Un aspecto interesante del uso de this es que resuelve la dificultad que a veces
se presenta al identificar sobre qué objeto se está trabajando.
Supongamos un caso en que se tiene una clase, que cuenta con un método de
transferencia. Dicho método transfiere todo el dinero de una cuenta, indicada
por parámetro, a la cuenta que representa el objeto en curso. La clase Cuenta y
el método transferencia podrían implementarse del siguiente modo:
Cuenta.java
class Cuenta {
public double saldo;
public String idCuenta;
PruebaCuenta.java
cc1.ingresar(100000);
cc2 = cc1;
cc1.transferencia(cc2);
System.out.println("Saldo primera cuenta: " + cc1.getSaldo() +
" Saldo segunda cuenta: " + cc2.getSaldo());
}
}
PruebaCuenta2.java
class Cuenta2 {
public double saldo;
public String idCuenta;
cc1.ingresar(100000);
FUOC • P03/75063/00959 72 El lenguaje Java
cc2 = cc1;
cc1.transferencia(cc2);
System.out.println("Saldo primera cuenta: " + cc1.getSaldo() +
" Saldo segunda cuenta: " + cc2.getSaldo());
}
}
Prueba sucesor() {
i++;
Al ejecutar este programa retorna
return this; un 2: el método sucesor no sólo
} incrementa la propiedad privada y,
sino que se retorna a sí mismo, y
ello permite llamarlo varias veces
Prueba escribir() { en el mismo orden.
System.out.println(i);
return this;
}
This también puede emplearse como método, o más bien como constructor,
lo que puede ser muy cómodo si se tienen distintos constructores con paráme-
tros diferentes, puesto que permite que se llamen entre sí:
Rectangulo3.java
public Rectangulo3() {
El segundo constructor, en lugar de
this(0, 0, 1, 1); modificar directament el valor de
las variables, llama al constructor
} que, al utilizar this admite cuatro
parámetros.
public float calcularArea() {
return (x2 - x1) * (y2 - y1);
}
Los atributos estáticos se emplean cuando es preciso que todos los elementos
de la clase puedan acceder a una variable. Estas variables también se conocen
como variables de clase y se declaran con el modificador static.
class Ejemplo {
int x; // x es una variable de instancia
static int y; // y es global en todas las instancias
}
Ejemplo
PruebaEj.java
class Ejemplo {
static int contador = 0;
int x;
public Ejemplo() {
contador++;
}
}
Los atributos estáticos también son útiles para definir constantes simbólicas,
independientemente de los objetos específicos que se construyen. En este ca-
so, también se utiliza el modificador final, mediante el cual se define la no mo-
dificabilidad del elemento que lo contiene. Así, todas las instancias de clases
que se creen pueden acceder a la constante.
Ejemplo
Las variables de tipo static son, en ciertos aspectos, similares a las varia-
bles globales de algunos lenguajes. El lenguaje Java no tiene variables
globales, pero sí static, a las que se puede tener acceso desde cualquier
instancia de una clase.
Los métodos con el modificador static, igual que las variables de clase, son pro-
Ejemplo
pios de la clase, sin que se apliquen específicamente a ningún objeto de la cla-
se. Es decir, puede emplearse sin crear ninguna instancia de la clase. Estos Son métodos static algunos de
los predefinidos por el lenguaje
métodos también se denominan métodos de clase. como la clase Math, en la que
las funciones trigonométricas
y logarítmicas son de tipo static.
Ejemplo
....
System.out.println("El mínimo es " + Math.min(2,3));
...
Otro ejemplo
LaFuncion.java Uso.java
– El método main() es estático, porque la aplicación debe acceder a él para ejecutarse, an-
tes de que se haga cualquier instancia.
FUOC • P03/75063/00959 75 El lenguaje Java
3.1. Agregación
Esta relación también se conoce como is-part-of , y solemos encontrarla en los En el ejemplo de diseño de clases
que cierra este apartado, veremos
una relación de agregación entre
tres casos siguientes: las clases Departamento - Asignatura
y Departamento - Alumno.
3.2. Asociación
Ejemplo
3.3. Uso
Casi siempre que existe una relación de agregación o de asociación entre dos
clases, también se da una relación de uso entre éstas, al menos en una direc-
ción. Pero la relación de uso es la más débil que existe, y si hay otras relaciones
ya no se dibuja.
Ejemplo
Supongamos que hay que guardar los datos referentes a los alumnos y a las
asignaturas de un colegio.
FUOC • P03/75063/00959 77 El lenguaje Java
En cuanto a los alumnos, interesa conocer su nombre y DNI. Así, será necesa-
rio crear una clase alumno con los atributos nombre y DNI:
Alumno.java
String nombre;
long dni;
Asignatura.java
importe java.util.*;
while (enum.hasMoreElemens()) {
Alumno alumno = (Alumno) enum.nextElemento();
lista.append(alumno.toString() + "\n");
}
return lista.toString();
}
}
FUOC • P03/75063/00959 78 El lenguaje Java
Además, habrá que definir una clase que se utilizará para llevar a cabo el man-
tenimiento de la información sobre las asignaturas y alumnos del colegio. Por
ello, se crea la clase Departamento, que contiene la lista de alumnos y la de las
asignaturas que se imparten y las mantiene.
Departamento.java
import java.util.*;
return alumno;
}
public Alumno buscarAlumno(long dni) {
Enumeration enum = alumnos.elementos();
while (enum.hasMoreElements()) {
Alumno alumno = (Alumno) enum.nextElement();
if (alumno.dni == dni) {
return alumno;
}
}
return null;
}
return asig;
}
public Asignatura buscarAsignatura(long codigo) {
Enumeration enum = asignaturas.elementos();
while (enum.hasMoreElements()) {
Asignatura asig = (Asignatura) enum.nextElement();
if (asig.codigo == codigo) {
return asig;
}
}
return null;
}
public String listaAsignaturas() {
Enumeration enum = asignaturas.elementos();
StringBuffer lista = new StringBuffer();
while (enum.hasMoreElements()) {
Asignatura asig = (Asignatura) enum.nextElement();
lista.append(asig.toString() + "\n");
}
return lista.toString();
}
}
FUOC • P03/75063/00959 79 El lenguaje Java
Secretaria.java
import java.io.*;
if (alumno == null) {
System.out.print("Nombre: ");
if (asignatura == null) {
System.out.println("Asignatura no existe");
return;
}
dpt.matricular(alumno, asignatura);
System.out.println("Operación realizada");
}
static void nuevaAsignatura(Departamento dpt) throws IOException {
System.out.print("Nombre asignatura: ");
if (asignatura == null) {
System.out.println("Asignatura no existente");
return;
}
System.out.println(asignatura.listaAlumnos());
}
System.out.println(dpt.listaAsignaturas());
}
int opcio;
do {
System.out.println("Escoge la opción");
System.out.println(" 1. Matricular alumno");
System.out.println(" 2. Crear nueva asignatura");
System.out.println(" 3. Mostrar asignaturas");
System.out.println(" 4. Mostrar alumnos matriculados");
System.out.println(" 5. Acabar");
System.out.print("Teclea la opción");
opcion = (int) readLong();
switch (opcion) {
case 1:
matricularAlumno(dpt);
break;
case 2:
nuevaAsignatura(dpt);
break;
case 3:
mostrarAsignaturas(dpt);
break;
case 4:
mostrarMatriculados(dpt);
break;
case 5:
break;
}
} while (opcion != 5);
}
}
Esta relación también se conoce como is-a, y es la solución de Java para casos
tan comunes como el siguiente: después de haber creado una clase, se necesita
una versión más especializada.
Por ejemplo, se ha creado la clase Empleado con sus datos, y es preciso crear la
clase Secretaria, que tendrá todos los datos de Empleado y unos datos privativos.
Puede decirse que Secretaria es un empleado con características adicionales.
Aunque una subclase hereda los métodos y las variables de la clase pa-
dre, no hereda de ella los constructores.
Todas las clases que se crean heredan de una clase padre global que es
la clase Object.
Punto.java
class Punto {
int x;
int y;
float norm() {
return (x * x) + (y * y);
}
Punto borrar() {
x = y = 0;
return this;
}
return this;
}
}
PuntoColor.java
boolean esBlanco() {
return c.equals("white");
}
FUOC • P03/75063/00959 82 El lenguaje Java
Ejemplo
Empleado.java
Secre.java
Dado que los objetos pueden ser apuntados por variables definidas del tipo de
la clase padre y pueden pasarse a los métodos, a menudo es preciso conocer
qué se ha pasado en realidad. Esta es la función del operador instanceof.
Ejemplo
Puede comprobarse qué es por medio del operador instanceof del siguiente
modo:
Para crear una clase nueva a partir de una ya existente, añadiéndole caracterís-
Sobrecarga
ticas nuevas, puede modificarse el comportamiento de la clase existente defi- de métodos
niendo en la clase nueva un método con el mismo nombre que la clase padre, Llamamos sobrecarga de méto-
dos a la existencia de métodos
el mismo tipo de retorno y la misma lista de argumentos. Lo llamamos redefi- con el mismo nobre, pero con
una lista de parámetros distin-
nición de métodos. ta, dentro de una misma clase.
La lista de parámetros indica
al compilador qué método se
Cuando se redefine un método hay que tener en cuenta lo siguiente: está invocando.
El modificador public hace que los métodos o clases sean accesibles desde cual-
quier lugar.
El modificador private hace que los métodos o atributos no sean visibles desde
fuera de la clase. Para cualquiera que se encuentre fuera de la clase, es como si
no existieran, porque no los puede ver.
FUOC • P03/75063/00959 84 El lenguaje Java
Los métodos que aparecen en la interfaz deben declararse public, porque tienen que ser
accesibles desde fuera de la clase.
Al no aparecer en la interfaz, los métodos secundarios sólo sirven para facilitar la imple-
mentación de los métodos public, no es necesarios declararlos public. Lo mismo sucede
con las variables.
El modificador protected es menos restrictivo que private y permite que los mé-
todos o atributos definidos como protected sean visibles desde su clase y las
subclases que dependen de él.
Ejemplo
Si se tienen una clase Z con atributos privados y una clase M que hereda la clase Z, la clase
M puede emplear los atributos de Z si se han declarado private? ¿Y si se han declarado
protected?
¡Vamos a comprobarlo!
A.java
public class A {
private String nombre;
private String apellidos;
B.java
javac B.java
– Los métodos que no se han implementado en la clase, también deben marcarse como
abstract.
– Las subclases de las clases abstractas deben implementar todos los métodos abstractos
que se han declarado en las clases padre.
El modificador final se utiliza para impedir que una clase pueda modificarse.
Ejemplo
Al declarar una clase como final, estamos indicando que se encuentra al final
de la jerarquía de clases, y ello impide que pueda heredarse. La clase java.lang.String, que
proporciona el mismo lengua-
je, es una clase final.
Los métodos también pueden definirse como finales. Los métodos marcados con la pala-
bra resenvada final no se pueden sobrescribir o redefinir. Esto será útil cuando la imple-
mentación de un método no pueda cambiarse porque, al hacerlo, por ejemplo, se pone
¡Alerta!
en peligro la consistencia de la clase.
Los métodos static o private
son final automáticamente.
En programación orientada al objeto no se puede declarar una clase abstract y Si una variable se marca
final a la vez: se estaría obligando e impidiendo, al mismo tiempo, la herencia con la palabra reservada final,
se convierte en una constante.
de esta clase.
Una interfaz es una variación de la idea de clase abstracta. En una interfaz to-
dos los métodos son abstractos, ninguno puede tener cuerpo y sólo pueden de-
finirse variables estáticas y finales.
Las interfaces se definen con la palabra reservada interface. Una clase puede
instanceof
implementar muchas interfaces. La implementación de la interfaz se indica al
final de la declaración de la clase y es una lista separada por comas. Puede emplearse el operador
instanceof para determinar
si la clase implementa una
interfaz.
Una clase sólo puede heredar de otra, pero puede definir todas las inter-
faces que precise.
El lenguaje unificado de modelización (UML) es un lenguaje gráfico y flexible UML: unified modeling language
de modelización que permite describir modelos que representan sistemas (tan-
to de software como del mundo real) basándose en los conceptos de la orien-
tación al objeto.
Sólo hay que incluir los atributos que interesen para diseñar el sistema.
FUOC • P03/75063/00959 88 El lenguaje Java
Una relación puede definirse como una conexión entre elementos. En mode-
lización de objetos, las principales relaciones que pueden establecerse son las
siguientes:
• Asociación
• Agregación
• Generalización
• Dependencia
Asociación
Asociación
tre clases. Un ejemplo de asociación podría ser el hecho de que una persona
trabaja para una empresa, o que una empresa tiene cierta cantidad de ofi-
cinas.
Una asociación normal entre dos clases representa una relación estruc-
tural entre iguales, o sea, las dos clases están conceptualmente al mismo
nivel, sin que una sea más importante que otra.
Una asociación puede tener dos nombres, uno para cada dirección. La direc-
ción de cada etiqueta se indica mediante un triángulo opaco cuya punta in-
dica la dirección (en la “base” del triángulo se escribe la etiqueta de la
asociación):
En el ejemplo sólo vemos un rectángulo con el nombre de la clase (no tenemos toda la
descripción de la clase: nombre, atributos y métodos. Esto es para simplificar y para que
los diagramas sean más compactos y más fáciles de leer, pero debería haber un diagrama
previo en que cada clase estuviera totalmente especificada.
Las asociaciones y las restantes relaciones entre clases pueden tener un cuan-
tificador que indica cuántos objetos están vinculados. El rango puede ser de
cero a uno (0..1), de cero a muchos (0..* ), de uno a muchos (1..*), de dos (2),
FUOC • P03/75063/00959 90 El lenguaje Java
de cinco a once (5..11), etc. Si no se especifica nada, se toma el valor 1 por de-
fecto. El rango se indica al principio y al fin de la relación.
Agregación
Generalización (herencia)
La generalización es una relación entre clases, nunca entre instancias (una clase puede
heredar de otra, pero un objeto sólo existe en tiempo de ejecución y no tiene sentido ha-
blar de herencia en cuanto a objetos), aunque las instancias están directamente afectadas
(polimorfismo) por su tipo.
Visibilidad
Los atributos y métodos que eran públicos en la superclase, también lo serán en la sub-
clase.
Los miembros (atributos y métodos) con visibilidad privada en la superclase, los hereda
la subclase, pero no son accesibles dentro de la subclase.
FUOC • P03/75063/00959 91 El lenguaje Java
Para proteger los atributos y/o métodos de la superclase y de la subclase del acceso exter-
no y conseguir que, a mismo tiempo, sean accesibles para ambas, podemos declararlos
protegidos.
Dependencia (uso)
Una dependencia es una relación de uso (un elemento emplea otro). La rela-
ción de dependencia es una conexión semántica entre dos elementes en que
uno depende del otro. Un cambio en el elemento independiente afectará al
dependiente, pero no al revés.
Ejemplos
Una clase que toma un objeto de otra clase como parámetro en alguno de sus métodos;
o una clase que llama a miembros estáticos de otra clase.
En estos casos, existe una dependencia de una clase con respecto a otra, pero no se da
una asociación explícita entre éstos.
Ejercicios de autoevaluación
1. ¿Existe algún método para saber si un carácter es una letra? Indicad su signatura y escribid
Pista
un ejemplo de uso.
2. Dado un entero, ¿cómo podemos obtener una cadena de caracteres con su representación? Pensad en la clase Character
(del paquete java.lang).
Indicad la signatura de la función o funciones que transforman un entero en un string y es-
cribid un ejemplo de uso con las representaciones hexadecimal, octal y decimal. Pista
3. Dada una cadena de caracteres que contiene el nombre de una persona, con un número
Pensad en la clase Integer
indeterminado de espacios al principio (por ejemplo “ 1111juan”), ¿cómo podríamos obte- (del paquete java.lang).
ner otra cadena con sólo la inicial del nombre en mayúscula?
4. Para enviar mensajes al canal de salida estándar, también llamado consola, se envía un Pensad en la clase String
mensaje al objeto out de la clase System (por ejemplo, System.out.println("Hola")). (del paquete java.lang).
Indicad de qué tipo de objeto estamos hablando; o sea, cuál es la clase de este objeto out.
Pista
5. Editad el siguiente programa y guardadlo con el nombre TDoble.java en un archivo.
Pensad en la clase System
Después, compiladlo, ejecutadlo y localizad los siete errores que contiene. Debéis tener en (del paquete java.lang).
cuenta que los errores pueden ser tanto sintácticos como de programación.
Identificad cada uno de los errores en el código resaltándolo en negrita y subrayado. Además,
debéis indicar por qué se produce y cómo se soluciona.
8. Realizad un programa en Java que calcule el mayor de diez números introducidos como
parámetro por la línea de instrucciones.
10. Realizad un programa en Java que lea un número e indique de qué números entre 1 y 10
es múltiplo.
FUOC • P03/75063/00959 94 El lenguaje Java
11. Realizad un programa en Java que calcule el promedio de los números leídos, siempre y
cuando el último leído sea un 0.
15. Realizad un programa en Java que lea dos números y si ninguno acaba en 9, escriba su Ejemplo
cuadrado.
Entrada: 1h 54min 59seg
16. Realizad un programa en Java que lea un número entero e indique los dígitos pares que Salida: 1h 55min 0seg
tiene.
17. Realizad un programa en Java que calcule la suma de los números pares entre 100 y 200
utilizando un bucle for, un bucle while y un bucle do.
18. Realizad un programa en Java que, a partir de unas palabras, indique si son iguales.
20. Realizad un programa en Java que retorne el seno, el coseno y la tangente de un ángulo
dado.
21. Realizad un programa en Java que, a partir de una frase, la escriba toda en mayúsculas.
22. Realizad un programa en Java que cuente la cantidad de vocales de una palabra.
23. Realizad un programa en Java que cuente los blancos de una frase.
24. Realizad un programa en Java que muestre todas las permutaciones de una cadena como
la siguiente: Ejemplo
Una variable x contiene un String que, a su vez, contiene tres caracteres diferentes (como, por Para la cadena abc, el progra-
ma retornaría lo siguiente:
ejemplo, “abc”).
abc
25. Realizad un programa en Java que, a partir de una frase, la escriba invertida. acb
bac
bca
26. Realizad un programa en Java que, a partir de un número en binario, lo escriba en decimal. cab
cba
27. Realizad un programa en Java que, a partir de un número en decimal, lo escriba en binario.
28. Realizad un programa en Java que, a partir de un número en una base determinada (de-
cimal, binario, octal, hexadecimal), lo pase a la base indicada como segundo parámetro
(decimal, binario, octal, hexadecimal).
29. Buscad en el API de Java todos los métodos que permiten trabajar con vectores y analizad
su utilidad.
30. Realizad un programa en Java que construya un array que guarde las letras del abecedario
y, posteriormente, las muestre en orden inverso y ocupando las posiciones pares del array.
31. Realizad un programa en Java que construya un array de enteros entre 1 y 100 y, poste-
riormente, los muestre en orden inverso y ocupando las posiciones impares del array.
32. Investigad, utilizando el API de Java, en qué paquete está guardada la clase Vector, qué mé-
todos (funciones y procedimientos) tiene y cómo hay que definirlo. Después, repetid los dos
ejercicios anteriores utilizando un vector en lugar de un array.
33. Realizad un programa en Java que sume 2 arrays y guarde el resultado en otro array. No
es preciso que solicitéis desde teclado los arrays de entrada. Ejemplo
023418910
34. Repetid el ejercicio anterior, pero empleando la clase Vector.
+137
35. Realizad un programa que indique cuántas veces aparece cada número entero especifica- 0 3 6 11 1 8 9 1 0
do en la línea de instrucciones. Considerad sólo los enteros entre 0 y 99.
FUOC • P03/75063/00959 95 El lenguaje Java
36. Realizad una programa que lea una línea de caracteres de la pantalla, la escriba en ma-
yúsculas y dé la suma de todos los números que aparecen en ella.
37. Realizad un programa que, dado el código de un alumno y sus notas, calcule el promedio
de las notas. Utilizad un array bidimensional para guardar cinco alumnos y cinco notas.
FUOC • P03/75063/00959 96 El lenguaje Java
Solucionario
1.
Signatura: +isLetter(ch : char): boolean
Ejemplo de uso: if (Character.isLetter(’A’) ) { ... }
2.
Signaturas:
+toString() : String
+toString(int i) : String
+toString(i : int, radix : int) : String
+toBinaryString(i : int) : String
+toHexString(i : int) : String
+toOctalString(i : int) : String
Ejemplo de uso:
Integer enter = new Integer(10);
String a = enter.toString();
String b = Integer.toString(10);
String c = Integer.toString(154,16);
String c2 = Integer.toHexString(154);
3.
Signaturas:
+trim() : String
+substring(int beginIndex, int endIndex) : String
+toUpperCase(): String
Ejemplo de uso:
// s contiene un String como indica el anunciado.
String resul = s.trim();
resul = resul.substring(0,1);
resul = resul.toUpperCase();
// resul contiene un String con el primer carácter no blanco en mayúscula.
// también puede escribirse todo junto.
resul = s.trim().substring(0,1).toUpperCase();
4.
El atributo out es de la clase: java.io.PrintStream.
5.
17 resultado = numero1 * 2;
18 mensaje = "El doble de " + " " + numero1 + " " + "es" + " " + resultado;
19 System.out.println(mensaje);
20 }
21 }
22 }
23 }
24
Errores de compilación
Error 1: El nombre del archivo debe ser el mismo que el de la clase, así que debe cambiarse
el nombre del archivo o el de la clase. Otra posibilidad es quitar el modificador public de la
clase.
Por ello, el error que aparece al compilar es un mensaje del siguiente tipo:
Error 2: La clase String se escribe en mayúsculas (Java es un lenguaje que distingue entre ma-
yúsculas y minúsculas –case sensitive).
Por ello, el error que aparece al compilar es un mensaje del siguiente tipo:
Error 3: Faltan los paréntesis que engloban la disyunción en la condición de la línea 11.
Por ello, el error que aparece al compilar es un mensaje del siguiente tipo:
Por ello, el error que aparece al compilar es un mensaje del siguiente tipo:
Por ello, el error que aparece al compilar es un mensaje del siguiente tipo:
Undefined variable i
Error 6: Sobra el ";" de detrás del for. Si no lo quitamos, se le está diciendo a la máquina
virtual que recorra todos los parámetros (sin hacer nada en ninguno de ellos) y que, al final,
ejecute una sola vez el bloque situado entre las líneas 16 y 21.
Por ello, el error que aparece al compilar es un mensaje del siguiente tipo:
Undefined variable i
Error de ejecución
Error 1: El array de strings que representan los parámetros de entrada como en la posición 0,
como hay n parámetros (argv.length), debemos parar en la posición n − 1 (argv.length-1).
También puede escribirse cambiando la comparación, en lugar de “para todo i menor o igual
a n − 1” también puede decirse “para todo i menor que n”.
Por este motivo, el error que aparece al compilar es un mensaje del tipo siguiente:
6. ParImpar.java
if ((a.length) != 1) {
System.out.println("Error: Debéis introducir un parámetro");
esnum = false;
} else {
i++;
}
}
return esnum;
}
if (controlErrores(argv)) {
if ((Integer.parseInt(argv[0]) % 2) != 0) {
System.out.println("El número " + argv[0] + " es impar");
} else {
System.out.println("El número " + argv[0] + " es par");
}
}
}
}
7. TablaMultiplicar.java
/**Tabla de multiplicar*/
public class TablaMultiplicar {
// función que controla el número y tipo de parámetros correctos
public static boolean controlErrores(String[] a) {
int i = 0;
boolean esnum = true;
if ((a.length) != 1) {
System.out.println("Error: Debéis introducir un parámetro");
esnum = false;
} else {
i++;
}
}
return esnum;
}
if (controlErrores(argv)) {
for (int i = 0; i <= 10; i++)
System.out.println(argv[0] + " * " + i + " = " +
(Integer.parseInt(argv[0]) * i));
}
}
}
FUOC • P03/75063/00959 99 El lenguaje Java
8. MayorDe10.java
i++;
}
return esnum;
}
if ((argv.length) != 10) {
System.out.println("Error: Debéis introducir 10 parámetros");
} else {
int i = 0;
i++;
}
if (i == 10) {
System.out.println("El número mayor es: " + resultado);
}
}
}
}
9. Factorial.java
if ((a.length) != 1) {
System.out.println("Error: Debéis introducir un parámetro");
esnum = false;
} else {
i++;
}
}
return esnum;
}
FUOC • P03/75063/00959 100 El lenguaje Java
if (controlErrores(argv)) {
if (Integer.parseInt(argv[0]) == 0) {
fact = 1;
} else {
for (int i = Integer.parseInt(argv[0]) - 1; i >= 1; i--)
fact = fact * i;
}
10. Multiplos1y10.java
if ((a.length) != 1) {
System.out.println("Error: Debéis introducir un parámetro");
esnum = false;
} else {
i++;
}
}
return esnum;
}
if (Integer.parseInt(argv[0]) != 0) {
for (int i = 10; i >= 1; i--) {
if ((Integer.parseInt(argv[0]) % i) == 0) {
System.out.println("El número " + i + " es múltiplo");
}
}
}
}
}
}
FUOC • P03/75063/00959 101 El lenguaje Java
11. PromedioNumeros.java
if ((a.length) == 0) {
System.out.println("Error: No habéis introducido el parámetro");
esnum = false;
} else {
while ((j < a.length) && (esnum)) {
while ((i < a[j].length()) && (esnum)) {
if ((a[j].charAt(i) >= 'A') && (a[j].charAt(i) <= 'z')) {
System.out.println("Error: Debéis introducir números");
esnum = false;
}
i++;
}
// while
j++;
i = 0;
}
if (esnum) {
if (!(a[(a.length) - 1].equals("0"))) {
System.out.println("Error: Última cifra debe ser un cero");
esnum = false;
}
}
}
// else
return esnum;
}
if (controlErrores2(argv)) {
for (int contador = argv.length - 2; contador >= 0; contador--) {
numero = integer.parseInt(argv[contador]);
suma = suma + numero;
}
12. NumeroPrimo.java
if ((a.length) != 1) {
System.out.println("Error: Debéis introducir un parámetro");
FUOC • P03/75063/00959 102 El lenguaje Java
esnum = false;
} else {
i++;
}
}
return esnum;
}
if (controlErrores(argv)) {
System.out.println("Calcula si el número " + argv[0] +
"es primo");
numero = Integer.parseInt(argv[0]);
13. SumaNumeros.java
14. HorasMinutosSegundos.java
if (argv.length == 0) {
System.out.println("ERROR: Formato hh:mm:ss como parámetro");
FUOC • P03/75063/00959 103 El lenguaje Java
} else {
System.out.println("Suma 1 segundo");
i++;
}
}
}
return esnum;
}
if (controlErrores(argv)) {
horai = Integer.parseInt(argv[0].substring(0, 2));
minutosi = Integer.parseInt(argv[0].substring(3, 5));
segundosi = Integer.parseInt(argv[0].substring(6, 8));
15. Cuadrados9.java
if (a.length != 2) {
System.out.println(
"ERROR: Debéis introducir dos números como parámetros");
esnum = false;
} else {
while ((j < a.length) && (esnum)) {
while ((i < a[j].length()) && (esnum)) {
if ((a[j].charAt(i) >= 'A') && (a[j].charAt(i) <= 'z')) {
System.out.println("ERROR: Debéis introducir números");
esnum = false;
}
i++;
}
// while
j++;
i = 0;
}
}
return esnum;
}
if (controlErrores2(argv)) {
System.out.println(
"Retorna el cuadrado de los números que acaban en 9 entre " +
argv[0] + " i " + argv[1]);
j = Integer.parseInt(argv[0]);
k = Integer.parseInt(argv[1]);
while (j <= k) {
j++;
if (Integer.toString(j).endsWith("9")) {
System.out.println("El número " + j +
" acaba en 9 y tiene el cuadrado: " + (j * j));
}
}
}
}
}
16. DigitosPares.java
if ((a.length) != 1) {
System.out.println("ERROR: Debéis introducir un parámetro");
esnum = false;
} else {
i++;
FUOC • P03/75063/00959 105 El lenguaje Java
}
}
return esnum;
}
if (controlErrores(argv)) {
System.out.println("Dígitos pares del número entero " + argv[0]);
parametro = argv[0];
if ((num % 2) == 0) {
System.out.println(parametro.charAt(i));
}
}
}
}
}
}
17. SumaNumerosParesA.java
// Suma los números pares entre 100 y 200 empleando un bucle FOR
public class SumaNumerosParesA {
public static void main(String[] argv) {
// Definición de las variables.
int suma = 0;
System.out.println(suma);
}
}
SumaNumerosParesB.java
// Suma los números pares entre 100 y 200 empleando un bucle WHILE
public class SumaNumerosParesB {
public static void main(String[] argv) {
// Definición de las variables
int suma = 0;
int i = 0;
i = i + 1;
}
System.out.println(suma);
}
}
FUOC • P03/75063/00959 106 El lenguaje Java
SumaNumerosParesC.java
// Suma los números pares entre 100 y 200 empleando un bucle DO WHILE
public class SumaNumerosParesC {
public static void main(String[] argv) {
// Definición de las variables
int suma = 0;
int i = 0;
do {
if ((i % 2) == 0) {
suma = suma + i;
}
i = i + 1;
} while (i <= 200);
System.out.println(suma);
}
}
18. PalabrasIguales.java
if (argv.length != 2) {
System.out.println(
"ERROR: Debéis introducir dos palabras como parámetros");
} else {
System.out.println("Comprueba si las palabras " + argv[0] + " i " +
argv[1] + " son iguales");
if (argv[0].compareTo(argv[1]) == 0) {
System.out.println("Ambas palabras son idénticas");
} else {
System.out.println("Ambas palabras son diferentes");
}
}
}
}
19. PalabraCapicua.java
if (argv.length != 1) {
System.out.println("ERROR: Debéis introducir una palabra
por parámetro");
} else {
System.out.println("Comprueba si la palabra " + argv[0] +
" es capicúa");
longitud = argv[0].length();
calculo = longitud / 2;
FUOC • P03/75063/00959 107 El lenguaje Java
if ((longitud % 2) == 0) {
izquierda = argv[0].substring(0, calcul);
if (izquierda.compareTo(derecha) == 0) {
System.out.println("Es capicúa");
} else {
System.out.println("No es capicúa");
}
}
}
}
20. SenoCosenoTangente.java
if ((a.length) != 1) {
System.out.println("Error: Debéis introducir un parámetro");
esnum = false;
} else {
i++;
}
}
return esnum;
}
21. FraseMayusculas.java
if (argv.length == 0) {
System.out.println("ERROR: Debéis introducir una frase por parámetro");
} else {
for (int i = 0; i < argv.length; i++) {
if (i == (argv.length - 1)) {
frase = frase.concat(argv[i]);
} else {
frase = frase.concat(argv[i] + " ");
}
frase2 = frase2.concat(frase.toUpperCase());
frase = "";
}
22. CuentaVocales.java
if (argv.length != 1) {
System.out.println("ERROR: Debéis introducir una palabra por parámetro");
} else {
palabra = argv[0];
longitud = palabra.length();
palabra = palabra.toUpperCase();
23. CuentaBlancos.java
System.out.println(frase);
longitud = frase.length();
for (i = 0; i < longitud; i++) {
FUOC • P03/75063/00959 109 El lenguaje Java
respuesta = Character.isWhitespace(frase.charAt(i));
if (respuesta) {
numBlancos = numBlancos + 1;
}
}
24. TresLetras.java
25. FraseInvertida.java
26. BinarioDecimal.java
if ((a.length) != 1) {
System.out.println("ERROR: Debéis introducir un parámetro);
esnum = false;
} else {
i++;
}
}
return esnum;
}
27. DecimalBinario.java
if ((a.length) != 1) {
System.out.println("ERROR: Debéis introducir un parámetro");
esnum = false;
} else {
i++;
}
}
return esnum;
}
28. PasoDeNumeros.java
if ((a.length) != 3) {
System.out.println("ERROR: Entra: Número baseNum baseAConvertir");
esnum = false;
} else {
while ((i < a[0].length()) && (esnum)) {
if ((a[0].charAt(i) >= 'A') && (a[0].charAt(i) <= 'z')) {
System.out.println("Error: Debéis introducir números");
esnum = false;
}
FUOC • P03/75063/00959 111 El lenguaje Java
if (Integer.parseInt(a[1]) == 2) {
if ((a[0].charAt(i) != '0') && (a[0].charAt(i) != '1')) {
esnum = false;
System.out.println("Error número a convertir no en base 2");
}
}
i++;
}
}
if (esnum == true) {
if ((Integer.parseInt(a[1]) != 2) && (Integer.parseInt(a[1]) != 8) &&
(Integer.parseInt(a[1]) != 10) &&
(Integer.parseInt(a[1]) != 16)) {
System.out.println("Error de base inicial");
esnum = false;
} else if ((Integer.parseInt(a[2]) != 2) &&
(Integer.parseInt(a[2]) != 8) &&
(Integer.parseInt(a[2]) != 10) &&
(Integer.parseInt(a[2]) != 16)) {
System.out.println("Error de base para convertir");
esnum = false;
}
}
return esnum;
}
if (controlErrores(argv)) {
switch (Integer.parseInt(argv[1])) {
case 2: {
numero10 = Integer.parseInt(argv[0], 2);
break;
}
case 8: {
numero10 = Integer.parseInt(argv[0], 8);
break;
}
case 10: {
numero10 = Integer.parseInt(argv[0], 10);
break;
}
case 16: {
numero10 = Integer.parseInt(argv[0], 16);
break;
}
default:
break;
}
switch (Integer.parseInt(argv[2])) {
case 2: {
numerof = Integer.toBinaryString(numero10);
break;
}
FUOC • P03/75063/00959 112 El lenguaje Java
case 8: {
numerof = Integer.toOctalString(numero10);
break;
}
case 10: {
numerof = Integer.toString(numero10);
break;
}
case 16: {
numerof = Integer.toHexString(numero10);
break;
}
default:
break;
}
30. Abecedario.java
31. Enteros.java
32. AbecedarioV.java
import java.util.*;
EnterosV.java
import java.util.*;
33. SumaArrays.java
34. SumaArraysV2.java
import java.util.*;
35. CuantasVeces.java
if ((a.length) == 0) {
System.out.println("ERROR: No habéis introducido ningún parámetro");
esnum = false;
} else {
while ((j < a.length) && (esnum)) {
while ((i < a[j].length()) && (esnum)) {
if ((a[j].charAt(i) >= 'A') && (a[j].charAt(i) <= 'z')) {
System.out.println("ERROR: Debéis introducir números");
esnum = false;
}
i++;
}
// while
j++;
i = 0;
}
}
return esnum;
}
numeros[i] = 0;
CuantasVecesV.java
import java.util.*;
if ((a.length) == 0) {
System.out.println("ERROR: No habéis introducido ningún parámetro");
esnum = false;
} else {
while ((j < a.length) && (esnum)) {
while ((i < a[j].length()) && (esnum)) {
if ((a[j].charAt(i) >= 'A') && (a[j].charAt(i) <= 'z')) {
System.out.println("ERROR: Debéis introducir números");
esnum = false;
}
i++;
}
// while
j++;
i = 0;
}
}
return esnum;
}
if (controlErrores2(args)) {
// llena el vector de ceros
for (int i = 0; i < 100; i++)
numeros.add(i, new Integer(0));
// suma 1 si se repite
int z;
36. LineaCaracteres.java
if ((a.length) == 0) {
System.out.println("ERROR: No habéis introducido ningún parámetro");
esnum = false;
}
return esnum;
}
FUOC • P03/75063/00959 116 El lenguaje Java
if (controlErrores(args)) {
for (int i = 0; i < args.length; i++)
frase = frase + args[i] + " ";
if (Character.isLetter(frase.charAt(i))) {
aux = aux + Character.toUpperCase(frase.charAt(i));
} else if (Character.isDigit(frase.charAt(i))) {
suma = suma +
(Integer.parseInt(frase.substring(i, i + 1)));
}
}
impResultado(aux, suma);
}
}
}
37. NotasAlumnos.java
System.out.println();
}
Glosario
API f Conjunto de rutinas (procedimientos y funciones que en la sintaxis de la programa-
ción orientada al objeto se conocen como métodos) que el lenguaje ofrece al programador.
array m Tipo de datos que permiten almacenar un conjunto de datos mediante determina-
dos índices.
atributo o variable de instancia m Los atributos de una clase almacenan la información que
describe e identifica una instancia especifica de la clase. Para cada clase, sólo es preciso incluir los
atributos que interesen para diseñar el sistema. Para cada atributo hay que especificar su nombre,
':' y el tipo. El tipo de un atributo puede ser cualquier clase o un tipo primitivo (int, char, etc.).
bytecode m Resultado de la compilación de archivos código fuente Java y que se carga, veri-
fica y ejecuta en el intérprete.
clase f Elemento básico de la programación orientada al objeto. Una clase es una descripción
de la estructura y el comportamiento de los objetos que pertenecen a ella.
garbage collection m Proceso que rastrea las operaciones de reserva de memoria y libera
automáticamente la memoria que no se necesita.
método m Operación, procedimiento o función que trabaja sobre los datos que representan
un objeto.
método accesor m Método que permite conocer, sin alterarlo, el estado del objeto.
sin método getter
método modificador m Método que permite alterar el estado (valores de las variables de
instancia) del objeto.
sin método setter
método static m Los métodos del modificador static son propios de la clase, sin que se apli-
quen específicamente en ningún objeto de la clase. Es decir, puede emplearse sin crear nin-
guna instancia de la classe.
sin método de clase
objeto m Agrupación o colección de datos y operaciones que tienen una estructura determi-
nada y mediante la que pueden modelizase aspectos relevantes de un problema.
private m Modificador que permite que toda la información declarada como private tenga
ocultación total; o sea, que sólo sea accesible desde la propia clase.
protected m Modificador que permite que toda la información declarada protected tenga
ocultación parcial; o sea, que sólo sea accesible desde la propia clase y las subclases.
public m Modificador que permite que toda la información (sea método, atributo o clase)
declarada public sea accesible desde fuera de la clase; o sea, puede accederse a los métodos así
definidos desde otras clases que no sean la propia.
sobrecarga f Definición de un mismo ítem con significados distintos, de modo que puede
interpretarse su significado según de qué modo se utilice.
super f Palabra reservada que apunta a la superclase de la clase en que se emplea. Sirve para
apuntar a alguna variable o método de la superclase.
this m Referencia especial que se utiliza dentro de cualquier método con el fin de poder re-
ferenciar el objeto actual. El valor this se refiere al objeto sobre el que se ha llamado el método
actual.
FUOC • P03/75063/00959 118 El lenguaje Java
vector m Clase que permite almacenar un conjunto de datos mediante determinados índices.
Bibliografía
Manual oficial de Sun.
SUN Microsystems (1998). Programación en Java. SL-276. Guía de Usuario (Revisión B).
API de Java.
Flanagan, D. (2002). Java in a Nutshell (4.ª ed.). O’Reilly & Associates, Inc.