Nested classes são classes construídas dentro de outras classes, diferentemente de uma classe normal ou top-level que é um membro direto do pacote (package).
São divididas em dois grupos: estáticas e não estáticas, as classes estáticas são chamadas static nested class, e as que não são declaradas como static são as chamadas inner classes.
A nested static class - por ser estática interage com a classe externa e com qualquer outra classe top-level.
para acessar a nested static class deve-se utilizar o nome da classe externa (ex:
classeExterna.NestedClass)
Instanciando uma nested static class:
Main.Inner2 objeto1 = new Main.Inner2();Esta classe não pode acessar os membros da classe externa.
A inner class, pode ser moldada como os modificadores (public, private, protected, abstract e final) pode ser instanciada apenas pela classe externa que a contém.
Para instanciar uma inner class é necessário primeiramente instanciar a classe externa:
Main objMain = new Main(); Main.Interna objetoInner = objMain.new Interna();Código-Exemplo:
public class Main
{ public static void main
(String[] args
) { // instanciando uma inner class Main objMain
= new Main
(); Main.
Interna objInner
= objMain.
new Interna
(); //instanciando classe estática - nested static class Main.
Estatica objStatic
= new Main.
Estatica(); objStatic.
getNome(); } //inner class public class Interna
{ String id
; //construtor da inner class Interna
(){ System.
out.
println("inner class instanciada"); } public void getNome
(){ System.
out.
println("Interna"); //acessando o método da classe main metodo1
(); } } // nested static class static class Estatica
{ String id
; //construtor da nested static class Estatica
(){ System.
out.
println("nested static class instanciada"); } public static void getNome
(){ System.
out.
println("Estatica"); } }//metodo da classe main public void metodo1
(){ System.
out.
println("metodo da classe main acessado"); }} Para quê usar classes internas?1) agrupar as classes logicamente - Se uma classe é usada apenas para apoio a outra classe, é melhor incorporar as classes.
2) Aprimora o encapsulamento - Imagine uma classe X que precisa acessar alguns membros da classe Z (declarados como private), escodendo a classe X dentro da classe Z, a classe X pode acessar os membros da classe Z mesmo estes sendo declarados como private.
3) Aprimora a manutenção e facilita a leitura de código - Escondedo classes internas as classes de alto nível, deixa o código perto de onde ele é realmente utilizado.
Ainda há dois tipos de inner classes que explicarei posteriormente.
Local inner classesAnonymous inner classes