Clases Anidadas en java

11
Anidamiento y Clases Internas

Transcript of Clases Anidadas en java

Page 1: Clases Anidadas en java

Anidamiento y Clases Internas

Page 2: Clases Anidadas en java

Anidamiento de clases

Es posible definir clases dentro de otras clases, las mismas que son conocidas como clases anidadas (nested classes) o clases internas (inner classes).

La clase que contiene a la inner class se la conoce como clase externa (outer class).

Fueron introducidas en el JDK 1.1. Se puede declarar una clase dentro de otra clase o

dentro de una interfase. Se puede declarar una interfase dentro de otra interfase

o dentro de una clase. Se puede declarar una clase dentro de un método. Se pueden tener varios niveles de anidamiento.

Page 3: Clases Anidadas en java

Anidamiento de clases

Una clase anidada puede acceder a todos los miembros (hasta los privados) de la clase que la contiene, pero la clase que la contiene no tiene los mismos permisos.

Los tipos de clases anidadas son: static nested (inner) classnon static nested (inner) classAnonymous inner class (clases anónimas)

Page 4: Clases Anidadas en java

Static Nested Class

No puede acceder a los miembros no estáticos de la clase que la contiene directamente, sino a través de un objeto. Estas clases son raramente usadas.

Page 5: Clases Anidadas en java

Ejemplo de static nested class

class OuterStatic {private int x = 100;void test() {

StaticNested obSta = new StaticNested();obSta.display();

}static class StaticNested {

int y = 30;int z = 20;void display() {

System.out.println("display: z = " + z);System.out.println("display: y = " + y);OuterStatic obO = new OuterStatic();System.out.println("display: x = " + obO.x);

}}

}class StaticNestedClassDemo {

public static void main(String args[]) {OuterStatic outer = new OuterStatic();outer.test();

}}

StaticNestedClassDemo.java

Page 6: Clases Anidadas en java

Non static nested class

Conocida también como Inner class.Tiene acceso a todas las variables y

métodos de la clase que la contiene (outer class).

Page 7: Clases Anidadas en java

Ejemplo de inner class

class Outer {int x = 100;void test() {

Inner obIn = new Inner();obIn.display();

}

class Inner {int y = 10;void display() {

System.out.println("display: x = " + x );System.out.println("display: y = " + y );

}}

}class InnerClassDemo {

public static void main(String args[ ]) {Outer outer = new Outer();outer.test();

}}InnerClassDemo.javaVer también: InnerClassDemo2.java, Outer3.java

Page 8: Clases Anidadas en java

Anidamiento de clases

Inner class además de ser definida dentro de otra clase, puede también definirse dentro de un método.

Una clase definida dentro de un método solamente puede acceder a las variables de este, que tengan el modificador final.

No se pueden definir miembros estáticos dentro de las Non static inner classes, exceptuando las constantes.

Ver InnerClassDem3.java

Page 9: Clases Anidadas en java

Anidamiento de clases

Existen clases internas que no tienen nombre, y son las conocidas anonymous inner classes.

Son útiles para manejar eventos. Las clases anónimas pueden extender de una

clase o implementar una interfase. La sintaxis para crear una clase anónima es la

siguiente: new <nombre de clase de la que hereda o interfase

que implementa> {

//cuerpo de la clase

}

Page 10: Clases Anidadas en java

Ejemplo de clase anónima

interface VideoClip { void play();void stop();

} class TestVideoClip {

void test(VideoClip v){

v.play();v.stop();

}}class AnonInnerClassDemo {

public static void main(String args[ ]) {TestVideoClip t = new TestVideoClip();t.test ( new VideoClip() {

public void play() { System.out.println(“Reproduciendo el video"); }public void stop() { System.out.println("Se detiene el video"); } } );

}}

AnonInnerClassDemo.java

Page 11: Clases Anidadas en java

Inner Classes

Cuando usted compila una inner class, obtiene un archivo .class con el siguiente formato de nombre: OuterClass$InnerClass.class

Cuando usted compila una clase anónima, obtiene un archivo .class con el siguiente formato de nombre:OuterClass$n.class, donde n es un entero que

comienza con 1.