Las clases internas pueden derivar de otras clases diferentes de la clase contenedora. E11 este
caso, conviene tener en cuenta las siguientes reglas:
- Las clases internas constituyen como una segunda jerarquía de clases en Java , por una parte están en la clases contenedora y ven sus variables: por otra pane pueden derivar de otra clase que 110 tenga nada que ver con la clase contenedora. Es muy importante evitar conflictos con los nombres. En caso de conflicto entre un nombre heredado y un nombre en la clase contenedora, el nombre heredado debe tener prioridad.
- En caso de conflicto de nombres. Java obliga a utilizar la referencia this con un nuevo significado: para referirse a la variable o método miembro heredado se utiliza this.name, mientras que se utiliza NombreClaseCont.this.name para el miembro de la clase contenedora..
- Si una clase contenedora deriva de una super-clase que tiene una clase interna, la clase interna de la sub-clase puede a su vez derivar de la clase interna de la super-clase y reclefmir todos los métodos que necesite. La casuística se puede complicar todo lo que se desee, pero siempre hay que recomendar hacer las cosas lo más sencillas que sea posible.
El uso de las clases internas miembro tiene las siguientes restricciones:
- Las clases internas no pueden tener el mismo nombre que la clase contenedora o package.
- Tampoco pueden tener miembros static: variables, métodos o clases.
// fichero Claseslnternas.java
// clase contenedora
class A {
class A {
int i=l; //
variable miembro
public A(int i) {this.i=i;} // constructor
// los métoodos de
la clase contenedora necesitan una
// referencia a los objetos de la clase interna
// referencia a los objetos de la clase interna
public void printA (B unB) {
System.out.println("i="+i+"
unB.j="+unB.j); // si acepta unB.j
>
// la clase interna
puede tener cualquier visibilidad. Con private da error
// porque main() no puede acceder a la clase interna
// porque main() no puede acceder a la clase interna
protected class B {
int j=2;
int j=2;
public
B(int j) {this.j=j;} // constructor
public void printB() {
public void printB() {
System.out.println("1=" + i + "
j=" + j); // si sabe qué es j
>
} // fin clase B
} // fin clase contenedora A
class
Claseslnternas {
public static void main(String []
arg) {
A al = new A(ll); A a2
= new A(12);
println("al.i=" + al.i + " a2.i=" + a2.i);
// forma de crear objetos de la clase interna
// asociados a un objeto de la clase contenedora
println("al.i=" + al.i + " a2.i=" + a2.i);
// forma de crear objetos de la clase interna
// asociados a un objeto de la clase contenedora
A.B bl = al.new Bf-lO), ¿2 = al.new B(-20);
// referencia directa a los objetos bl y b2
(sin cualificar).
println("bl.j=" + bl.j + " b2.j=" + b2.j);
println("bl.j=" + bl.j + " b2.j=" + b2.j);
// los métodos de la clase interna pueden
acceder directamente a
// las variables miembro del objeto de la clase contenedora
bl.printB(); // escribe: i=ll j=-10
b2.printB(); // escribe: i=ll j=-20
// las variables miembro del objeto de la clase contenedora
bl.printB(); // escribe: i=ll j=-10
b2.printB(); // escribe: i=ll j=-20
// los métodos de la
clase contenedora deben recibir referencias
// a los objetos de la clase interna, pera que puedan identificarlos
// a los objetos de la clase interna, pera que puedan identificarlos
al.printA(bl); al.printA(b2);
A a3 = new
A(13);
A.B b3 = a3.new B(-30);
A.B b3 = a3.new B(-30);
println("b3.j=" + b3.j);
a3 - nuil; // se destruye la referencia al
objeto de la clase contenedora
b3.printB(); // escribe: i=13 j=-30
b3.printB(); // escribe: i=13 j=-30
a3 = new A(14); //
se crea un nuevo objeto asociado a la referencia a3
// b3 sigue asociado an anterior objeto de la clase contenedora
b3.printB(); // escribe: i=13 j=-30
} // fin de main()
// b3 sigue asociado an anterior objeto de la clase contenedora
b3.printB(); // escribe: i=13 j=-30
} // fin de main()
public static void println(String str)
{System.out.println(str);}
} // fin clase Claseslnternas
} // fin clase Claseslnternas
No hay comentarios:
Publicar un comentario