Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Java Standard
Edition
Nivel III.
I
o Diferencias entre clases abstractas 45
e interfaces.
o Ventajas. 45
o Declaración. 46
o Ejemplo. 47
o Implementación de una interfaz en 49
una clase.
o Jerarquía entre interfaces. 51
o Utilización de una interfaz como un 55
tipo de dato.
o Ejemplo 55
Variables de clase (static) 60
o definición. 60
o Ejemplo de Uso. 61
Constantes o variables finales (final) 65
o Definición. 65
o Ejemplo de uso. 65
Simulación de la Estructura Básica de 66
una Herencia Múltiple con uso de
interfaces.
II
TRATAMIENTO Y CONTROL
El tratamiento de excepciones en Java es un mecanismo del
lenguaje que permite gestionar errores y situaciones excepcionales.
Debido a que el tratamiento de excepciones es uno de los pilares
fundamentales del lenguaje, todo programador sabe
cómo lanzarlas y capturarlas, pero (como cualquier aspecto
fundamental en programación) es necesario conocer con cierta
profundidad el propósito por el cual tenemos disponible dicho
mecanismo, además de hacer un uso correcto de esta funcionalidad.
Definición de excepción
1
Tipos de excepciones
2
La clase principal de la cual heredan todas las excepciones Java
es Throwable. De ella nacen dos ramas: Error y Exception. La primera
representa errores de una magnitud tal que una aplicación nunca
debería intentar realizar nada con ellos (como errores de la JVM,
desbordamientos de buffer, etc) y que por tanto no tienen cabida en este
curso. La segunda rama, encabezada por Exception, representa
aquellos errores que normalmente si solemos gestionar, y a los que
comúnmente solemos llamar excepciones.
3
Bloque try
try {
// Sentencias Java
}
4
bloque try, esa excepción será manejada por el controlador que esté
asociado con el bloque try.
Bloque catch
catch(UnTipoTrhowable nombreVariable ) {
// sentencias Java
}
5
Se pueden controlar grupos de excepciones, es decir, que se pueden
controlar, a través del argumento, excepciones semejantes. Por
ejemplo:
6
otros en el árbol de jerarquía. Se deben colocar primero los
controladores que manejen las excepciones más alejadas en el árbol de
jerarquía, porque de otro modo, estas excepciones podrían no llegar a
tratarse si son recogidas por un controlador más general colocado
anteriormente.
7
Bloque finally
Este bloque finally puede ser útil cuando no hay ninguna excepción.
Es un trozo de código que se ejecuta independientemente de lo que se
haga en el bloque try.
8
add( "South",p );
}
try {
// Código peligroso
}
catch( AlgunaExcepcion e ) {
VentanaError = new DialogoError( this );
VentanaError.show();
}
9
Sentencia throw
throw ObjetoThrowable;
class Ejemplo {
static void demoproc() {
try {
throw new NullPointerException( "demo" );
} catch( NullPointerException e ) {
System.out.println( "Capturada la excepción en demoproc" );
throw e;
}
}
10
public static void main( String args[] ) {
try {
demoproc();
} catch( NullPointerException e ) {
System.out.println( "Capturada de nuevo: " + e );
}
}
}
11
Sentencia throws
class Ejemplo2 {
static void demoproc() {
System.out.println( "Capturada la excepción en demoproc" );
throw new IllegalAccessException( "demo" );
}
}
12
public static void main( String args[] ) {
demoproc();
}
class Ejemplo3 {
static void demoproc() throws IllegalAccessException {
System.out.println( "Dentro de demoproc" );
throw new IllegalAccessException( "demo" );
}
13
Excepciones checked
import java.io.FileWriter;
import java.io.IOException;
FileWriter fichero;
14
try {
ioex.printStackTrace();
import java.io.FileWriter;
import java.io.IOException;
15
// En lugar de capturar una posible excepción, la relanzamos
Hay que tener presente que cuando se relanza una excepción estamos
forzando al código cliente de nuestro método a capturarla o relanzarla.
Una excepción que sea relanzada una y otra vez hacia arriba terminará
llegando al método primigenio y, en caso de no ser capturada por éste,
producirá la finalización de su hilo de ejecución (thread).
16
No es competencia nuestra ningún tratamiento de ningún tipo
sobre el error que se ha producido
Excepciones unchecked
int[] numerosPrimos = {1, 3, 5, 7, 9, 11, 13, 17, 19, 23}; // Array de diez
//elementos
17
if(indiceUndecimoPrimo > numerosPrimos.length) {
} else {
// ...
18
Malas prácticas de uso
try {
} catch(Exception ex) {}
try {
} catch(Exception ex) {
19
logging.log("Se ha producido el siguiente error: " +
ex.getMessage());
Algo más razonable sería pintar una traza completa del error
mediante uno de los métodos informativos de Throwable:
try {
} catch(Excepcion ex) {
try {
int i = 0;
20
while(true) {
System.out.println(numerosPrimos[i++]);
} catch(ArrayIndexOutOfBoundsException aioobex) {}
21
legibilidad del código. Sin embargo, esta obligación puede llegar
a cargar el código cliente:
try {
} catch(UnTipoDeException ex1) {
// Gestionar...
} catch(OtroTipoDeException ex2) {
// Gestionar...
} catch(OtroTipoMasDeException ex3) {
// Gestionar...
} catch(OtroTipoTodaviaMasDeException ex3) {
// Gestionar...
22
try {
} catch(Exception ex) {
23
}
Por último, existe una técnica para convertir toda excepción checked
en unchecked:
try {
} catch(Exception ex) {
24
últimos años ha crecido una comunidad de usuarios Java que abogan
por eliminar el sistema de excepciones checked, que es justo lo que
hace el código anterior. Si alguno de estos usuarios lee esto,
probablemente discrepe con la idea de incluir dicho código (o cualquiera
de sus variantes con menos ámbito de alcance y por tanto menos
agresiva) dentro de lo que se consideran malas prácticas. Unos ven
ventajas sobre el tratamiento de excepciones de tipo checked (porque
nos da control sobre los errores que se producen a través de estructuras
basadas en código legible y con un propósito claro), otros ven
desventajas (sobrecarga del lenguaje y en última instancia del código
con una funcionalidad que,no es absolutamente perfecta). Existe
actualmente un debate abierto sobre la verdadera utilidad de las
excepciones checked. Tal vez en próximas versiones de Java (o en el
próximo gran lenguaje orientado a objetos) se elimine cualquier
concepto actual de error comprobado, pero en el momento actual no es
así.
25
Recomendaciones de uso
26
detalles de nuestra implementación muchos niveles por encima de lo
deseable. El último problema, que es importante y puede ser crítico, es
que si en el futuro deseamos intercambiar una de las capas más
concretas y ésta ha cambiado su implementación, todas las capas por
encima se romperán. Por tanto, debemos lanzar excepciones
apropiadas a la abstracción en la que nos encontramos:
try {
} catch(BajoNivelException bnex) {
27
/**
*/
// ...
28
CLASES ABSTRACTAS
Concepto
29
Implementación
@Override
public void metodoAbstracto() {
/**Implementación definida por la clase concreta*/
}
30
Características de una Clase Abstracta.
31
¿Cuándo Utilizarlas?
32
en concreto (de su clase). Por otra parte, la acción dibujar no tiene
sentido para la clase genérica FiguraGeometrica, porque esta clase
representa una abstracción del conjunto de figuras posibles.
33
abstractas se les llama resúmenes. Una clase abstracta para Java es
una clase de la que nunca se van a crear instancias: simplemente va a
servir como superclase a otras clases. No se puede usar la palabra
clave new aplicada a clases abstractas, y si intentamos crear objetos en
el código nos saltará un error.
34
Métodos abstractos
35
Tips
¿Es necesario que una clase que tiene uno o más métodos
abstractos se defina como abstracta? Sí, si declaramos un método
abstracto el compilador nos obliga a declarar la clase como abstracta
porque si no lo hiciéramos así tendríamos un método de una clase
concreta no ejecutable, y eso no es admitido por Java.
36
Ejemplo Básico numero 1
37
Definimos la Subclase Circulo que hereda de Figura y observamos
que se implementa el método abstracto area();
38
39
Ejemplo Básico numero 2:
40
/**
* Clase Abstracta Instrumento
*/
abstract class Instrumento{
/**
* Clase Concreta Guitarra, hija de Instrumento
*/
public Guitarra(){
tipo="Guitarra";
}
/**
* Clase Concreta Violin, hija de Instrumento
*/
class Violin extends Instrumento {
public Violin(){
tipo="Violin";
}
41
/**
* Clase Concreta Saxofon, hija de Instrumento
*/
class Saxofon extends Instrumento {
public Saxofon(){
tipo="Saxofon";
}
42
Como vemos cada una de las clases concretas implementan el
método tocar()y le dan la funcionalidad dependiendo de cómo se toque
el instrumento, también en cada constructor de las clases definimos
el tipo, pero si nos fijamos bien en las clases concretas no tenemos la
variable tipo declarada, pues estamos usando la variable heredada de
la clase Instrumento.
43
INTERFACES
Definición
44
Diferencias entre clase abstracta e interfaces
Ventajas
Organizar la programación.
permiten declarar constantes que van a estar disponibles para
todas las clases que queramos (implementando esa interfaz)
Obligar a que ciertas clases utilicen los mismos métodos (nombres
y parámetros).
Establecer relaciones entre clases que no estén relacionadas.
45
Declaración de una interfaz.
// Cuerpo de la interfaz . . .
46
Por ejemplo, la interfaz Modificación declara la cabecera de un único
método:
/**
*/
/**
*/
47
Tercer ejemplo: la interfaz Numerico declara una constante real y
dos cabeceras de métodos con el siguiente código fuente:
/**
*/
48
Implementación de una interfaz en una clase
/**
*/
valor = i;
return valor;
49
valor += a;
/**
*/
p.incremento(12);
System.out.println(p.daValor());
50
Para poder emplear una constante declarada en una interfaz, las
clases que no implementen esa interfaz deben anteponer el identificador
de la interfaz al de la constante.
// Cuerpo de la interfaz . . .
Las clases que implementan la interfaz Una también lo hacen con Dos
y Tres.
51
}
return totalSinIVA;
if (valorMinimo<x)
52
totalSinIVA=x;
else
totalSinIVA=0;
totalSinIVA *= (1-t/100);
a.asignaValor(250.0);
a.rebaja(20);
53
Si una interfaz implementa otra, incluye todas sus constantes y
declaraciones de métodos, aunque puede redefinir tanto constantes
como métodos.
...
54
Utilización de una interfaz como un tipo de dato.
...
55
public int esMayor(Comparable otra);
En algún caso puede ser útil declarar una interfaz vacía como, por
ejemplo:
56
public void sumergirse();
57
public Aerosub vehiculo;
this.vehiculo=vehiculo;
vehiculo.emerger();
vehiculo.despegar();
vehiculo.acuatizar();
vehiculo.sumergirse();
this.vehiculo= vehiculo;
58
vehiculo.despegar();
vehiculo.acuatizar();
this.vehiculo= vehiculo;
vehiculo.sumergirse();
vehiculo.emerger();
59
VARIABLES DE CLASE (static).
Definición
60
Ejemplo de Uso.
61
Las variables de clase se emplean cuando sólo es necesaria una
copia por clase que, además, esté accesible por todas las instancias de
la clase a la que pertenece. En este caso, al ser un atributo public y
static, puede accederse directamente a la variable de clase
(totalCuentas) a través de una instancia (c1 o c2) o de la clase en sí
(CuentaBancaria). Un atributo estático puede ser accedido desde
cualquier instancia de la clase, ya que es miembro de la propia clase.
c1.totalCuentas++;
c2.totalCuentas++;
62
CuentaBancaria.totalCuentas++; System.out.println("Total
cuentas: " + CuentaBancaria.totalCuentas);
// Resto de sentencias . . .
Total cuentas: 1
Total cuentas: 2
Total cuentas: 3
totalCuentas++;
63
Las variables de clase pueden declararse como public, protected o
como private y pueden pertenecer a cualquiera de los tipos de datos
primitivos de Java o bien, a otra clase existente en Java o declarada por
el usuario. En principio, la única limitación para el número de variables
de clase que puede declarar una clase es el espacio libre disponible por
el sistema que ejecute el programa.
64
CONSTANTES O VARIABLES FINALES (final)
Definición
Ejemplo de Uso
// Constante de clase
65
este caso, el valor asignado a la variable final puede hacerse en función
de otros datos o de llamadas a métodos, con lo que el valor de la
constante no tiene porqué ser el mismo para diferentes ejecuciones del
programa.
public interface b{
//código
}
public interface c{
//código
}
66