You are on page 1of 4

Clases internas - Java 1.

1
Permiten el anidamiento de clases Definicin de una clase dentro de otra Definicin de una clase localmente a un bloque de cdigo Propsito Agrupacin de clases relacionadas Control de visibilidad de las clases Proximidad entre la definicin y el uso de las clases Definicin de clases simples de ayuda o adaptacin

Clases internas

Nuevo modelo de eventos de Java 1.1 (AWT y Swing)

Cdigo ms claro que evita el exceso de clases muy pequeas que no necesitan conocer los usuarios de un paquete
Java BFM 1 Java BFM 2

Tipos de clases internas


Clases e interfaces anidadas de alto nivel Tambin se denominan clases internas estticas Clases internas Clases miembro Clases locales Clases annimas

Clases e interfaces de alto nivel


Clases o interfaces estticos anidados dentro de otra clase (clase externa, contenedora o encapsuladora) Deben declararse de tipo static Slo se pueden anidar dentro de clases normales o de clases internas de alto nivel No es necesario un objeto de la clase externa para crear un objeto de la clase interna esttica Especificacin del tipo del objeto

NombreClaseExterna.NombreClaseInterna

Desde la clase esttica interna slo se pueden acceder a los miembros estticos de la clase externa Nombrado fichero .class

NombreClaseExterna$NombreClaseInterna
4

Java BFM

Java BFM

Ejemplo - modificacin de Eckel


// Para poder ejecutar la prueba hay que poner en // Settings, Java Target, Main Class : MarcoPrueba$Probador public class MarcoPrueba { static int i= 5; public MarcoPrueba() {}; void metodo() {System.out.println(" dentro de metodo de MarcoPrueba");} // clase interna esttica que prueba el funcionamiento de la clase externa public static class Probador { public static void main(String args[]) { // acceso al miembro esttico de la clase externa System.out.println( "Dentro de probador" + i); MarcoPrueba marco= new MarcoPrueba(); marco.metodo(); } } // fin de probador }
Java BFM 5

Clases miembro
Clase interna definida como miembro (no static) de otra clase contenedora Pueden declararse como privadas o protegidas (esto no impide su acceso desde la clase contenedora) Cada instancia de una clase miembro se asocia internamente a una instancia de la clase contenedora Tiene acceso completo y directo a la clase externa (incluido miembros private)

Simplifica el cdigo

No puede tener miembros estticos No pueden tener nombres comunes con la clase externa

Conflicto de nombrado

No es posible crear un objeto de la clase interna sin tener un objeto de la clase contenedora Java BFM

Ejemplo - clase adaptadora Enumerador


public class PilaArray { Object array[]; int cima = 0; PilaArray(int tamanoLimiteFijo) {array = new Object[tamanoLimiteFijo]; } public void apila(Object item) { array[cima++] = item; } public Object desapila() { return array[--cima]; } public boolean estaVacia() { return cima == 0; } // clase adaptadora que queda oculta class Enumerador implements java.util.Enumeration { int cont = cima; public boolean hasMoreElements() { return cont > 0; } public Object nextElement() { if (cont == 0) throw new NoSuchElementException("Pila en Array"); return array[--cont]; } } // Enumerador // devuelve un enumerador sobre la pila public java.util.Enumeration elementos() { return new Enumerador(); }}

Ejemplo - prueba de la clase


public class Prueba { public static void main(String args[]) { PilaArray pila; pila = new PilaArray(5); // rellenamos la pila for (int i=0; i<5; i++) { String cad = "hola" + i; pila.apila(cad); } // creamos un enumerador sobre la pila y // lo utilizamos para listar sus elementos java.util.Enumeration enumerador; enumerador = pila.elementos(); while (enumerador.hasMoreElements()) { String cad = (String) enumerador.nextElement(); System.out.println( cad ); } }}
7 Java BFM 8

Java BFM

Clases miembro
Nueva sintaxis de this, new y super Referencia al objeto de la clase contenedora

Clases locales
Clase interna definida dentro de un bloque de cdigo Slo son visibles y utilizables dentro del bloque de cdigo en el que se encuentran definidas Pueden usar variables locales y parmetros de mtodo declarados como final

NombreClaseContenedora.this referenciaObjetoContenedor.new NombreClaseInterna() dentro del constructor de la clase especializada


referenciaObjetoContenedor.super()

Creacin de un objeto de una clase interna

En herencia de una clase interna

Se evitan problemas de sincronizacin (inconsistencias)

// pruebas con new // fallara si la clase enumerador se hubiera declarado privada PilaArray.Enumerador enum2 = pila.new Enumerador(); while (enum2.hasMoreElements()) { String cad = (String) enum2.nextElement(); System.out.println( cad ); }
Java BFM 9

No pueden incluir un modificador de acceso ni ser estticas Uso extensivo en el nuevo tratamiento de eventos de Java 1.1 Creacin de clases de ayuda o adaptacin que no estn disponibles pblicamente (inaccesibles)

Java BFM

10

Ejemplo - clase local


// definicion de una clase local que implementa un enumerador Enumeration miEnumerador (final Object array[]) { class ClaseLocal implements java.util.Enumeration { int cont = 0; public boolean hasMoreElements() { return cont < array.length; } public Object nextElement() { if (cont == array.length) throw new NoSuchElementException("Pila en Array"); return array[cont++]; } } return new ClaseLocal(); } // devuelve un enumerador sobre la pila public java.util.Enumeration elementos() { return miEnumerador(array); }
Java BFM 11

Clases annimas
Clase interna local sin nombre Se define e instancia en una sola operacin Slo puede existir una instancia de una clase annima Una clase annima puede ser incluida en una expresin java Los constructores annimos deben ser sencillos para evitar la excesiva anidacin de cdigo Muy utilizado en adaptadores de clase Aadir comportamiento a objetos que ya tienen nombre (AWT, Swing) Escritura de pequeos callbacks encapsulados (enumeradores, iteradores, )
Java BFM 12

Ejemplo - clase annima


// devuelve un enumerador sobre la pila mediante una clase annima public Enumeration elementos() { return new Enumeration() { int cont = cima; public boolean hasMoreElements() { return cont > 0; } public Object nextElement() { if (cont == 0) throw new NoSuchElementException("Pila en Array"); return array[--cont]; } }; }

Java BFM

13

You might also like