Java Classes Internas
1. Significado
Na linguagem de programação Java, os programas são construídos a partir de classes. As aulas também podem ser declaradas dentro de uma aula e chamamos uma classe interna de classe.
2. Função
• Implementando melhor encapsulamento, sabemos que os modificadores de acesso para classes comuns (classes não internas) não podem ser privadas ou protegidas, enquanto as classes internas podem. Quando declaramos a classe interna como privada, apenas a classe externa pode acessar a classe interna, escondendo bem a classe interna.
• As classes internas podem herdar (estender) ou implementar (implementos) outras classes ou interfaces sem serem afetadas por classes externas.
• As classes internas podem acessar diretamente os campos e métodos de classes externas, mesmo que sejam modificadas com privado. Pelo contrário, classes externas não podem acessar diretamente os membros de classes internas.
3. Princípio
As classes internas são um conceito de tempo de compilação. Após a compilação, dois arquivos de classe independentes serão gerados, como segue:
public class Outer {private string OutroTerMame = "Outer"; classe interna {private string innername = "interna"; }}O arquivo compilado é o seguinte:
Após a compilação, o Outer.inner é renomeado para o $ interno, e o período (.) É substituído pelo sinal do dólar ($).
4. Classificação
As classes internas da Java podem ser divididas em classes internas de membros, classes internas locais, classes internas anônimas e classes internas estáticas.
1) Classe interna de membros
Uma classe interna de membro pode ser considerada como membro de uma classe externa. Um membro estático não pode ser declarado em uma classe interna do membro, mas o campo final estático é uma exceção. Sabemos que quando uma classe é carregada, os membros estáticos serão inicializados primeiro. Se a classe interna do membro tiver membros estáticos, a classe interna será gerada antes da classe externa. A classe interna serve a classe externa e a classe interna gerada antes da classe externa pode estar fora de controle. Ao instantar uma classe interna de membro, a classe interna do membro manterá uma referência ao objeto atual da classe externa, para que os membros da classe externa possam ser acessados diretamente na classe interna do membro, mesmo que o privado seja modificado.
importar java estático.lang.system.out; public class Outer {private string OutroTerMame = "Outer"; // A classe externa não pode acessar diretamente os membros da classe interna e precisa instanciar o objeto de classe interna privado interno interno = new Inner (); classe pública interna {private string innername = "interna"; public void Show () {out.println (externo nome); // você pode acessar diretamente os membros da classe externa}} public void show () {out.println (interno.innername); interna.Show (); } public static void main (string [] args) {externo externo = new Outer (); exter.show (); // instanciam a classe interna externo. interna.Show (); }}Resultados em execução:
interno
exterior
exterior
A referência ao objeto de classe externa da classe interna do membro é composta pelo nome da classe externa antes disso. Este formulário é chamado
Limited-this, out.println (externo) e out.println (Outer.This.outername) são equivalentes.
2) Classes internas locais
O uso de classes internas locais é basicamente o mesmo que as classes internas de membros. É apenas que as classes internas locais são definidas nos métodos da classe externa, assim como as variáveis locais, e não são membros da classe externa. Uma classe interna local é inacessível fora do método, mas suas instâncias podem ser retornadas do método e as instâncias permanecerão até que não sejam mais referenciadas. As classes internas locais também podem acessar variáveis locais, parâmetros de método etc. do método em que estão localizados. A limitação é que variáveis locais ou parâmetros de método só podem ser acessados quando declarados como final.
importar java estático.lang.system.out; public class Outer {private string OutroTerMame = "Outer"; public void show (final string str) {// Os parâmetros do método são a classe final da classe interna {public void print () {out.println (externo nome+str); }} Interno interno = new Inner (); interno.print (); } public static void main (string [] args) {externo externo = new Outer (); Exter.Show (": lalala"); }}Resultados em execução:
Exterior: Lalala
3) classe interna anônima
Você pode imaginar classes internas anônimas como classes internas locais sem nomes de classes. Classes internas anônimas têm as seguintes características:
1. Classes internas anônimas não podem ter construtores. As classes internas anônimas não têm nomes de classe, portanto o construtor não pode ser declarado.
2. Classes internas anônimas devem herdar ou implementar uma interface. O tipo atribuído a New é o supertipo de classe anônima. As aulas anônimas não podem ter se estendidas ou implementa cláusulas exibidas, nem podem ter modificadores.
3. As classes internas anônimas são as mesmas das classes internas dos membros e as classes internas locais, e os membros estáticos não podem ser declarados.
importar java estático.lang.system.out; public class Outer {private string OutroTerMame = "Outer"; public void show (final string str) {new iner () {// implemente a interface interna public void print () {out.println (externo nome+str); } }.imprimir(); } public static void main (string [] args) {externo externo = new Outer (); Exter.Show (": lalala"); }} interface interna {void print (); }Resultados em execução:
Exterior: Lalala
4) classe interna estática
A classe interna estática, também chamada de classes aninhadas em alguns livros, requer o uso de modificadores estáticos ao declará -lo. A classe interna estática é diferente das três primeiras classes internas. A classe interna estática não mantém referências ao objeto atual da classe externa; portanto, membros não estáticos da classe externa não podem ser acessados na classe interna estática. Pode -se dizer que a classe interna estática não depende da classe externa.
importar java estático.lang.system.out; public class Outer {private string OutroTerMame = "Outer"; private static int id = 123; interno privado interno = novo interno (); classe estática pública interna {public void print1 () {//out.println(outername); Membro não estático da classe externa não pode ser acessado.println (id); } public static void print2 () {out.println (id); }} public void show () {Inner.print1 (); } public static void main (string [] args) {externo externo = new Outer (); exter.show (); Exter.inner.print2 (); // Acesse o Acesso a classe interna estática através do nome da classe}}