Classes internas de Java
Classes internas de Java
Em Java, também é possível aninhar classes (uma classe dentro de uma classe). O objetivo das classes aninhadas é agrupar classes que pertencem umas às outras, o que torna seu código mais legível e fácil de manter.
Para acessar a classe interna, crie um objeto da classe externa e, em seguida, crie um objeto da classe interna:
Exemplo
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)
Classe Interna Privada
Ao contrário de uma classe "regular", uma classe interna pode ser private
ou protected
. Se você não quiser que objetos externos acessem a classe interna, declare a classe como private
:
Exemplo
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);
}
}
Se você tentar acessar uma classe interna privada de uma classe externa, ocorrerá um erro:
Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
Classe Interna Estática
Uma classe interna também pode ser static
, o que significa que você pode acessá-la sem criar um objeto da classe externa:
Exemplo
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: assim como static
atributos e métodos, uma static
classe interna não tem acesso aos membros da classe externa.
Acessar a classe externa da classe interna
Uma vantagem das classes internas é que elas podem acessar atributos e métodos da classe externa:
Exemplo
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