Clases internas de Java
Clases internas de Java
En Java, también es posible anidar clases (una clase dentro de una clase). El propósito de las clases anidadas es agrupar clases que pertenecen juntas, lo que hace que su código sea más legible y fácil de mantener.
Para acceder a la clase interna, cree un objeto de la clase externa y luego cree un objeto de la clase interna:
Ejemplo
class OuterClass {
int x = 10;
class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
// Outputs 15 (5 + 10)
Clase interna privada
A diferencia de una clase "regular", una clase interna puede ser private
o protected
. Si no desea que los objetos externos accedan a la clase interna, declare la clase como private
:
Ejemplo
class OuterClass {
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
Si intenta acceder a una clase interna privada desde una clase externa, se produce un error:
Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
Clase interna estática
Una clase interna también puede ser static
, lo que significa que puede acceder a ella sin crear un objeto de la clase externa:
Ejemplo
class OuterClass {
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
// Outputs 5
Nota: al igual que static
los atributos y los métodos, una static
clase interna no tiene acceso a los miembros de la clase externa.
Acceder a la clase exterior desde la clase interior
Una ventaja de las clases internas es que pueden acceder a atributos y métodos de la clase externa:
Ejemplo
class OuterClass {
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
// Outputs 10