Documentos de Académico
Documentos de Profesional
Documentos de Cultura
0500 Clases Java
0500 Clases Java
2
• El programa más sencillo posible es una
clase con un método main(), dentro del
cual se encuentra todo el código. Esto es
como un programa en C o C++ que solo
tuviera la función main() metida en una
clase
3
• Normalmente los programas constan de
varias clases, y se utiliza como programa
principal el método main() de una de ellas.
4
• La herramienta jar permite agrupar todas
las clases del programa en un solo archivo
de tipo .jar.
5
• Cada clase puede tener su propio método
main, pero se ejecuta el método main()
que se indica en el archivo manifest del
archivo .jar
6
¿Como es un programa (mínimo)
en Java?
[public] class Identificador {
[public][private][protected] característica;
...
[public][private][protected] característica;
8
• Para probar código, un programa como el
anterior funciona perfectamente.
9
• En el programa siguiente se hace lo mismo,
pero empleando un método de una clase.
10
public class HolaMundo {
11
• Se pueden añadir más métodos a la clase
12
public class HolaMundo {
14
• Esta es la clase HolaMundo, una clase
independiente que no tiene programa
principal pero si tiene métodos.
15
package testprogram;
16
• Esta otra es la clase principal, que hace uso
de la clase HolaMundo (mas bien, hace uso
de sus métodos).
17
package testprogram;
18
• De este modo, una clase que contiene
métodos viene a ser una biblioteca de
funciones como las que se utilizan en C.
19
• Las clases no solo contienen métodos,
también contienen atributos (como las
variables de una estructura). Para dar
valores iniciales a esos atributos se emplea
un “constructor”, que es un método de
nombre igual al de la clase, y que se ejecuta
automáticamente
20
Constructores
21
• Un constructor es un método que carece
de tipo proporcionado (ni siquiera void) y
cuyo nombre es igual al de la clase.
• La característica fundamental de un
constructor es q se ejecuta
automáticamente siempre q se crea un
ejemplar de la clase.
22
Ejemplo de
Constructor
23
• En el método main() de la clase Tirar1 se
crea un ejemplar de la clase Pepito, y no se
ejecuta explícitamente ningún método.
24
package tirar1;
/**
*
* @author bruegel
*/
public class Tirar1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Pepito p = new Pepito();
}
}
25
• Esto se debe a que la clase Pepito posee un
constructor, que se ha ejecutado
automáticamente cuando se ha creado un
ejemplar de Pepito en el método main() de
Tirar1.
26
package tirar1;
/**
*
* @author bruegel
*/
class Pepito {
public Pepito() {
System.out.println(“Tócame, Roque");
}
}
27
Otro ejemplo de
Constructor
28
• En el ejemplo siguiente se crea una clase
llamada persona que tiene dos atributos,
nombre y teléfono. Los dos reciben valor
inicial en un método constructor.
29
Clase con constructor
package personabasicojava;
class Persona {
30
• La clase Persona se utiliza desde la clase
PesonaBasicoJava (podría tener cq otro
nombre).
31
Clase con constructor
package personabasicojava;
}
Proyecto: PersonaBasicoJava
32
• Se pueden crear constructores que admitan
argumentos, para sí dar valores iniciales
arbitrarios a los atributos.
33
• La tendencia actual parece ser un híbrido
de Java y C++; se admiten funciones fuera
de las clases y se tiende a agrupar todo el
contenido de la clase en un único bloque
de código (y en un solo archivo).
34
¿Como es una un programa
/*
en C++ (I)?
* File: Persona.h
* Author: coti
*
* Created on 18 de julio de 2015, 19:23
*/
#include <iostream>
#ifndef PERSONA_H
#define PERSONA_H
class Persona {
public:
Persona();
std::string nombre;
int tel;
};
#endif /* PERSONA_H */
35
¿Como es una un programa
en C++ (II)?
/*
* File: Persona.cpp
* Author: coti
*
* Created on 18 de julio de
2015, 19:23
*/
#include "Persona.h"
Persona::Persona() {
nombre = "Juan";
tel = 5551234;
}
36
¿Como es una un programa
/*
* File: en C++ (y III)?
main.cpp
* Author: coti
*
* Created on 16 de julio de 2011, 17:30
*
* Este programa muestra una clase básica llamada Persona.
* La clase dispone de un constructor por omisión (sin argumentos)
* y dos atributos, nombre y tel.
*/
#include <iostream>
#include "Persona.h"
Persona p;
cout << "Nombre : " << p.nombre << endl;
cout << "Telefono : " << p.tel << endl;
return 0;
}
37
• Las clases contienen atributos (similares a
los campos de una estructura) y métodos
(similares a funciones).
38
• Los atributos tienen ambito local, es decir,
son visibles desde todos los métodos de la
clase.
39
• Los métodos también tienen ámbito local,
es decir, son visibles (y ejecutables) desde
todos los demás métodos de la clase.
40
• Se puede modificar el alcance del ámbito
de métodos y atributos individualmente,
empleando las palabras reservadas
public, protected y private.
41
• Las variables que se declaran dentro de un
método son locales dentro de ese método
(no se ven desde otros métodos ni desde
otras clases)
42
DEMO
CrearClasesFicha
43
Declaración de
atributos en Java
44
Declaración de atributos en Java
package crearclasesficha; Ver proyecto CrearClasesFichaJava.
import java.util.Scanner;
import static coti.aux.Aux.readFloat;
import static coti.aux.Aux.readInt;
import static coti.aux.Aux.readString;
public Ficha(String no,String a,String c,String ID,String g,float[] ca,int n,String cm) { // Código omitido }
46
Declaración de métodos en Java
package crearclasesficha;
import java.util.Scanner;
import static coti.aux.Aux.readFloat; Los métodos marcados con private son
import static coti.aux.Aux.readInt; privados; los marcados con public son
import static coti.aux.Aux.readString;
públicos y que no tienen modificador tienen
public class Ficha { visibilidad de paquete.
private String nombre;
private String apellidos;
private String curso; Ver proyecto CrearClasesFichaJava.
private String DNI;
private String grupoPracticas;
private int numNotas;
private float[] calificaciones;
private String comentarios;
public Ficha() {
nombre = "Nombre";
apellidos = "Apellidos";
Cuerpo del constructor sin argumentos
curso = "2014";
DNI = "01234567X";
grupoPracticas = "X7";
numNotas = 5;
calificaciones = new float[numNotas];// Imprescindible asignar memoria
for (int i = 0; i < numNotas; i++) {
calificaciones[i] = i;
}
comentarios = "Comentarios";
} 47
Cuerpos de los métodos en Java
/*
*
* El método leerDeTeclado() no utiliza Aux.
* El método leerDeTeclado2() utiliza Aux.
*
*/
package crearclasesficha; Los métodos marcados con private son
import java.util.Scanner;
privados; los marcados con public son
import static coti.aux.Aux.readFloat; públicos y que no tienen modificador tienen
import static coti.aux.Aux.readInt;
import static coti.aux.Aux.readString; visibilidad de paquete.
import static coti.aux.Aux.readString_ne;
public class Ficha {
49
Cuerpos de los métodos en Java
void leerDeTeclado() { // Continúa en la transparencia siguiente
Scanner sc = new Scanner(System.in);
String temp;
boolean numeroBien = false;
do {
System.out.printf("Por favor, escriba su nombre: ");nombre = sc.nextLine();
if (nombre.isEmpty()) {
System.out.println("\nPerdón, este campo no se puede dejar en blanco\n");
}
} while (nombre.isEmpty());
System.out.printf("Por favor, escriba sus apellidos: ");apellidos = sc.nextLine();
System.out.printf("Por favor, escriba su curso: ");curso = sc.nextLine();
System.out.printf("Por favor, escriba su DNI: ");DNI = sc.nextLine();
System.out.printf("Por favor, escriba su grupo de prácticas: ");
grupoPracticas = sc.nextLine();
do {
numeroBien = false;
do {
System.out.printf("Por favor, escriba el número de calificaciones: ");
temp = sc.nextLine();
} while (temp.isEmpty());
try {
numNotas = Integer.parseInt(temp);
numeroBien = true;
} catch (Exception e) {
System.out.printf("\nPerdón, número incorrecto.Pruebe de nuevo.\n");
numeroBien = false;
}
} while (!numeroBien);
Obsérvese que no se admite que el atributo nombre esté vacío. Esto exige utilizar un bucle do-while, que
alarga el método considerablemente. Se admite que los50demás campos de tipo String estén vacíos.
Cuerpos de los métodos en Java
// Sigue el método leerDeTeclado(). Es un método largo y complicado.
calificaciones = new float[numNotas];
for (int i = 0; i < numNotas; i++) {
do {
numeroBien = false;
do {
System.out.printf(String.format("nota[%d] = ", i));
temp = sc.nextLine();
} while (temp.isEmpty());
try {
calificaciones[i] = Float.parseFloat(temp);
numeroBien = true;
} catch (Exception e) {
System.out.printf("\nPerdón, nota incorrecta. Pruebe de nuevo.\n");
numeroBien = false;
}
} while (!numeroBien);
}
System.out.printf("Por favor, escriba sus comentarios: ");
comentarios = sc.nextLine();
}
Para leer cada calificación individual se lee primero una cadena no vacía; una vez obtenida, se traduce a float y
se almacena en la tabla de calificaciones. Este procedimiento se repite para todas las notas. Una vez más, esto
alarga mucho el método, puesto que el proceso debe repetirse para cada variable individual. Sería ideal
disponer de métodos auxiliares que se encargasen de esta tarea.
51
Cuerpos de los métodos en Java
// El método leerDeTeclado2() hace mucho más que el método leerDeTeclado(),
// y hace uso de un 80% menos de código.Véase la clase coti.aux.Aux
void leerDeTeclado2() {
void escribirEnPantalla() {
System.out.printf("Nombre :%20s%n", nombre);
System.out.printf("Apellidos :%20s%n", apellidos);
System.out.printf("Curso :%20s%n", curso);
System.out.printf("DNI :%20s%n", DNI);
System.out.printf("Prácticas :%20s%n", grupoPracticas);
System.out.printf("Notas :%20d%n", numNotas);
for (float f : calificaciones) {
System.out.printf("%33.2f%n", f);
}
System.out.printf("Comentarios :%20s%n",comentarios);
}
}
52
Constructores en Java
Existe un tipos de métodos con características especiales: los constructores.
1- package ordenctoresjava;
2-
3- /**
4- *
5- * @author coti
6- */
7- public class OrdenCtoresJava {
8-
9- /**
10- * @param args the command line arguments
11- */
12- public static void main(String[] args) {
13- ClaseBase cb1 = new ClaseBase(1);
14- ClaseBase cb2 = new ClaseBase(2);
15- ClaseDerivada cd1 = new ClaseDerivada(3);
16- ClaseDerivada cd2 = new ClaseDerivada(4);
17- OtraClase otc = new OtraClase();
18- }
19- }
En el constructor de las líneas 13 a la 17 se pasa un argumento, un número que sirve para marcar los
ejemplares y observar así el orden de ejecución. Básicamente, se sigue un orden cronológico de atributos,
salvo los atributos static, cuyos ctores se ejecutan en primer lugar. Al igual que en C++, cuando se crea
un ejemplar de una clase derivada, se ejecuta primero54el ctor de la clase base
Orden de ejecución de ctores en Java
package ordenctoresjava;
int ejemplar;
public ClaseBase() {
System.out.printf("%s%n", "Ctor clase base sin argumentos.");
}
public ClaseBase(int e) {
ejemplar = e;
System.out.println("Ctor Clase Base " + ejemplar);
}
}
package ordenctoresjava;
public OtraClase(){
atributo2 = new ClaseBase(55);
atributo3 = new ClaseDerivada(66);
}
}
package crearclasespersonajava;
/**
*
* @author coti
*/
public class Persona {
public Persona(String nombre, String direccion, int telefono, float talla, String DNI) {
this.nombre = nombre;
this.direccion = direccion;
this.telefono = telefono;
this.talla = talla;
this.DNI = DNI;
}
57
Métodos de acceso en Java
public Persona() { return telefono;
nombre = "<áéíóú>"; }
direccion = "<áéíóú>";
telefono = 5551234; public void setTelefono(int telefono) {
talla = 1.75f; // Por qué se pone la f? this.telefono = telefono;
DNI = "12345678X"; }
}
public float getTalla() {
/** return talla;
* @return the nombre }
*/
public String getNombre() { public void setTalla(float talla) {
return nombre; this.talla = talla;
} }
void escribirEnPantalla() {
System.out.printf("Nombre : %20s%n", nombre);
System.out.printf("Dirección : %20s%n", direccion);
System.out.printf("Teléfono : %20d%n", telefono);
System.out.printf("Talla : %20.2f%n", talla);
System.out.printf("DNI : %20s%n", DNI);
}
}
/*
Obsérvese que no se ha marcado “Use accessors even when field is accessible”.
En Java, todos los métodos son inline (no hay funciones externas).
Obsérvese también que en el método leerDeTeclado() se hace uso de los métodos
declarados en Esdia, que se ha importado al principio del archivo.
*/
59
EXCEPCIONES
60
Throwable
Error Exception
IOExce SQLExcep
RuntimeException ...
ption tion
61
Excepciones en Java
Las excepciones de Java son clases que se derivan de Throwable. Esta clase posee
dos subclases, Error y Exception, de las cuales se derivan las demás
excepciones de Java.Los programas escritos en Java pueden lanzar excepciones. Las
excepciones pertenecen a tres categorías:
62
Excepciones en Java
63
Excepciones en Java
64
Jerarquía de excepciones en Java
Throwable
Error Exception
IOExce SQLExcep
RuntimeException ...
ption tion
Las excepciones comprobadas (checked exceptions) se muestran en azul en el diagrama. Todas ellas se
derivan directamente de Exception. El compilador nos obliga a capturar o especificar las
excepciones comprobadas.
Los excepciones no comprobadas (unchecked exceptions) se muestran en rojo en el diagrama. Todas
ellas se derivan directamente de Error y de RuntimeException. El compilador no obliga a
comprobarlas.
Obsérvese que RuntimeException se deriva de Exception. Por tanto, un catch() que
capture Exception procesará tanto las excepciones comprobadas como los errores de ejecución. Si
65
Excepciones en Java
El requisito de Captura o Especificación
De estas tres categorías, las excepciones que pertenecen a la primera tienen que cumplir
necesariamente el requisito de Captura o Especificación, esto es, todo bloque de código que
lance una excepción del tipo (1) tiene que capturar esa excepción, o debe notificar que puede
lanzar ese tipo de excepción. El compilador lo impone, y de hecho ofrece su ayuda. Las excepciones
de los tipos (II) y (III) no están obligadas a cumplir el requisito de captura o especificación, aunque se
admite su captura o especificación.
Para notificar que un código pueden lanzar una excepción, es preciso emplear una sentencia throws:
66
Excepciones en Java
Sintaxis
try {
// Código vigilado
}
catch(ExcepcionCapturada_1 ex1) {
// Código que procesa ex1
}
catch(ExcepcionCapturada_2 ex2) {
// Código que procesa ex2
}
finally
{
// Código que se ejecuta siempre,
// tanto si se procesa una excepción como si no
}
67
Excepciones en C++
No todos los errores dan lugar al lanzamiento de una excepción, aun cuando el error cometido haga
que los resultados obtenidos sean incorrectos. Esto se hace porque la eficiencia se resentiría mucho
si se comprobasen todos los resultados. La solución de este problema es utilizar siempre tipos de
datos cuyo alcance sea mayor que el mayor resultados posible; esta medida debe complementarse con
la oportuna validación de los datos que debe procesar el programa.
#include <iostream>
#include <stdexcept>
#include <climits>
using namespace std;
int main(int argc, char** argv) {
int n1, n2, n3;
n1 = n2 = INT_MAX;
try {
n3 = n1 + n2;
cout << n1 << " + " << n2 << " = " << n3 << endl;
} catch (exception & e) {
cout << e.what();
}
cout << "\n\nY aquí no ha pasado nada!\n\n";
return 0;
}
Véase el proyecto PruebaExcepciones
68
Excepciones en Java
El manejo de excepciones en Java puede observarse en el proyecto PruebaExcepciones.
public class PruebaExcepciones {
70
Excepciones en Java
El archivo ExcepcionesEnJava.java es como sigue:
try {
unaLista.escribirLista_1(f1);
} catch (IOException ex) {
System.out.println("\nNo fue posible escribir en el archivo "
+ f1.getName());
System.out.println(ex);
} finally {
System.out.println("\nSe ha ejecutado el método escribirLista_1()");
}
unaLista.escribirLista_2(f2);
}
}
public ListaDeNumeros() {
lista = new ArrayList<Integer>(NUM_ELEMENTOS);
for (int i = 0; i < NUM_ELEMENTOS; ++i) {
lista.add(new Integer(i));
}
}
salida.close();
}
Este método especifica la excepción que lanza el código que contiene, mediante la expresión throws
IOException.
72
Excepciones en Java
public void escribirLista_2(File f) {
PrintWriter salida = null;
try {
FileWriter fw = new FileWriter(f);
salida = new PrintWriter(fw);
Este método captura la excepción que lanza el código que contiene, mediante un bloque try{} que
alberga las llamadas que pueden dar lugar a la excepción
73
Excepciones en Java
En ciertas ocasiones es preciso reaccionar frente a una excepción en más de un lugar. Esto puede
conseguirse relanzando la excepción, una vez efectuada una primera parte del procesamiento. El
proyecto PruebaRelanzarExcepcionJava muestra un ejemplo.
// Archivo RelanzarExcepcion.java
public class RelanzarExcepcion {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
PruebaRelanzar p = new PruebaRelanzar();
try {
p.lanzar_capturar_y_relanzar();
} catch (Exception e) {
System.out.println("\n\nMain; excepción capturada ---> " + e);
}
}
}
74
Excepciones en Java
Para relanzar una excepción se emplea de nuevo la sentencia throw, como puede verse en el método
lanzar_capturar_y_relanzar().
throw ex;
} finally {
System.out.println("PruebaRelanzar: lanzar_capturar_y_relanzar()");
}
}
}
En el bloque catch() se efectúa un primer procesamiento y se relanza la excepción, que será capturada en main().
75
Excepciones en Java
Cuando se lanza una excepción, el entorno de ejecución busca un bloque catch() que contenga la
llamada causante de la excepción, y sea capaz de procesarla. Si se encuentra ese bloque, la excepción
se captura. Si no se encuentra, el flujo de control asciende por la sucesión de llamadas a métodos,
buscando un catch() apropiado. Si finalmente no se encuentra es catch(), el programa se
detiene, no por la excepción, sino por no haber encontrado un bloque adecuado para procesarla. El
proyecto RecorridoInversoDeLaPila muestra un ejemplo.
//Archivo RecorridoInversoDeLaPila
public class RecorridoInversoDeLaPila {
La llamada a metodo_1() da lugar a otra llamada a metodo_2(), que llama a metodo_3(), que
lanza una excepción. Esa excepción se procesa finalmente en main(), tras ascender por la pila
efectuando un recorrido inverso.
76
Excepciones en Java
El método 3 tiene que capturar o especificar la Exception que lanza. Opta por especificarla. El
método 2 tiene que capturar o especificar la Exception que produce el método 3, al cual invoca.
Opta por especificarla.El método 1 tiene que capturar o especificar la Exception que produce el
método 2. Opta por especificarla.
//Archivo ClaseDePrueba
public class ClaseDePrueba {