English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1. O que é a classe interna?63;
A classe definida dentro da classe, chamada de classe interna
public class Out{ class In{ //Neste momento, In é a classe interna } }
2. Por que usar a classe interna?63;
1) Aumenta a encapsulamento, oculta a classe interna na classe externa, não permitindo que outras classes acessem a classe interna
2) A classe interna pode melhorar a legibilidade e a manutenção do código
3. Classificação da classe interna
Para a classificação da classe interna, pode ser comparada com a classificação dos membros variáveis.
Podemos dividir os membros variáveis de acordo com diferentes modificadores ou diferentes locais de definição, podendo ser: variável membro da classe, variável membro de instância, variável local.
Se a classe interna é vista como um membro da classe externa, a classe interna pode usar o modificador public/Modificador padrão/Modificador protected/Modificador private. Também pode ser static.
Da mesma forma, a classe interna também é dividida de acordo com o uso de diferentes modificadores ou a definição de diferentes locais4Classe:
1) Classe interna de instância: a classe interna não usa o modificador static
2) Classe interna estática: a classe interna usa o modificador static
3) Classe interna local: definida dentro de um método
4) Classe interna anônima: pode ser usada apenas uma vez, é um caso especial da classe interna
3.1Classe interna de instância:
1) Definição: classe interna de instância, ou seja, a classe interna não usada com o modificador static. Isso indica que a classe interna de instância pertence ao objeto da classe externa, não pertence à classe externa em si (comparação com campo).
2) Criar a classe interna de instância
//Classe externa class Outter { // Classe interna: não usada com o modificador static class Inner { } } public class InnerDemo1 { public static void main(String[] args) { // Criar a classe interna de instância, sem usar o modificador static, pertence ao objeto da classe externa, portanto, antes de criar a classe interna de instância, deve existir um objeto da classe externa. Outter out = new Outter(); // Criar um objeto da classe interna através do objeto da classe externa Outter.Inner in = out.new Inner(); } }
3): Características:
a. Conhecendo o processo de criação da classe interna de instância, quando existe um objeto da classe interna, há necessariamente um objeto da classe externa.
b. A instância da classe interna mantém automaticamente a referência à instância da classe externa; a classe interna de membro pode acessar todos os campos e métodos da classe externa sem condições.
Atenção: quando a classe interna de membro possui variáveis ou métodos com o mesmo nome que a classe externa, ocorre o fenômeno de ocultação.
Não é possível acessar os membros da classe interna diretamente a partir da classe externa; é necessário criar um objeto da classe interna de membro e acessar através da referência a esse objeto.
//Classe externa class Outter { private String name = "out"; private Integer age = 17; // Classe interna: não usada com o modificador static class Inner { private Integer age = 18; // Ocorre o fenômeno de ocultação, ocultando o age da classe externa Inner() { // Características:1. A classe interna pode acessar diretamente os membros da classe externa // 2. Quando a classe interna e a classe externa têm campos ou métodos com o mesmo nome, ocorre o fenômeno de ocultação System.out.println(name + this.age);// Saída out18 // Neste momento, se precisar usar o age da classe externa, a sintaxe é: classe externa.this.age System.out.println(Outter.this.age);// Saída17 } } }
Resumo: Em termos simples, é olhar para o escopo das variáveis, o escopo dos membros da classe externa é toda a classe externa, enquanto a classe interna na classe externa (pode ser vista como um campo da classe externa), a classe interna naturalmente pode acessar a classe externa. Para que a classe externa acesse os membros da classe interna, pode ser compreendido assim: os membros da classe interna pertencem à classe interna, são válidos dentro da classe interna. Se a classe interna não existir, os membros variáveis também não existirão. Portanto, a classe externa não pode acessar diretamente os membros da classe interna, é necessário criar um objeto da classe interna membro, e acessar através da referência para esse objeto.
3.2Classe interna estática
1) Definição: Usada com o modificador static. Portanto, essa classe interna pertence ao próprio classe externa, não ao objeto da classe externa
2) Criar classe interna estática
//Classe externa class Outter { // Classe interna estática: usada com o modificador static static class Inner { } } public class InnerDemo2 { public static void main(String[] args) { // Porque a classe interna estática pertence ao próprio classe externa, pode ser acessada diretamente através do nome da classe externa (comparável a um campo) Outter.Inner in = new Outter.Inner(); } }
3): Características:
a. Ao criar uma instância da classe interna, não é necessário criar uma instância da classe externa.
b. A classe interna estática pode acessar diretamente os membros estáticos da classe externa, e para acessar os membros instâncias da classe externa, deve-se acessar através do objeto da classe externa.
Entenda simplesmente: os membros estáticos pertencem à classe, os membros não estáticos pertencem ao objeto. Para acessar os membros instâncias da classe externa (não estáticos), é claro que é necessário manter o objeto da classe externa. A criação da classe interna estática não requer um objeto da classe externa, portanto, se precisar acessar os membros instâncias da classe externa, deve-se acessar através do objeto da classe externa.
c. É possível definir membros estáticos e instâncias na classe interna estática.
d. A classe de teste pode acessar diretamente os membros estáticos da classe interna estática através do nome completo da classe.
//Classe externa class Outter { static String name = "outter"; public Integer age = 17; // Classe interna estática: usada com o modificador static static class Inner { Inner() { // A classe interna estática pode acessar diretamente os membros estáticos da classe externa System.out.println(name);// Saída outter // Para acessar os membros de instância da classe externa, é necessário acessá-los através de uma instância da classe externa. System.out.println(new Outter().age);// Saída 17 } } }
3.3Classe interna local (quase nunca usada)
1): Definição: A classe interna definida dentro de um método, seu escopo de visibilidade é o método atual, e está no mesmo nível que as variáveis locais, portanto, a classe interna local pode ser usada apenas dentro do método.
Atenção, a classe interna local, assim como as variáveis locais dentro do método, não pode ter os modificadores public, protected, private e static.
public class InnerDemo3 { public static void main(String[] args) { // Classe interna local class Inner { } } }
2): Características:
a. A classe interna local e a classe interna de instância não podem conter membros estáticos. (A classe interna local pertence ao método, enquanto os membros estáticos pertencem à classe)
b. A classe interna local e a classe interna de instância podem acessar todos os membros da classe externa.
c. As variáveis locais acessadas pela classe interna local devem ser modificadas por final, no Java8é adicionado automaticamente implicitamente (gramática doce).
Razão: Após a execução do método, o frame da pilha do método é destruído e o espaço de variáveis locais dentro do método é destruído. No entanto, o objeto da classe interna pode ainda estar na memória da pilha, e será eliminado apenas quando não houver mais referências. Neste momento, pode ocorrer uma situação: a classe interna precisa acessar uma variável local inexistente. Para evitar esse problema, usamos o modificador final nas variáveis locais, tornando-as constantes e residentes na memória, mesmo após a destruição do método, a variável local continua na memória, e o objeto pode continuar a ser mantido.
public class InnerDemo3 { public static void main(String[] args) { int age = 17; final int num = 15; // Classe interna local class Inner { public void test() { // Erro: Não é possível referenciar um-variável final age dentro de uma classe interna definida em um método diferente System.out.println(age); System.out.println(num);// Correto } } } }
3.4Classe interna anônima (usada com mais frequência)
1): Definição: A classe interna anônima é uma classe interna local sem nome, adequada para classes que são usadas apenas uma vez.
2) Criação de classe interna anônima:
A classe interna anônima não possui construtor, mas chama o construtor da classe pai. Geralmente, a classe interna anônima é usada para herdar de outras classes ou implementar interfaces, não necessitando adicionar métodos adicionais, apenas para implementar ou sobrescrever métodos herdados.
Atenção: a classe interna anônima deve herdar de uma classe pai ou implementar uma interface, mas não pode herdar mais de uma classe pai ou implementar mais de uma interface.
//Definir um contrato interface Person { public void eat(); } public class AnonymousDemo { public static void main(String[] args) { // Uso de classe interna anônima Person p = new Person() { public void eat() { System.out.println("comer algo"); } }; p.eat(); } }
4.resumo
5.questão de entrevista
public class Outer { public void someOuterMethod() { // Linha 3 } public class Inner { } public static void main(String[] argv) { Outer o = new Outer(); // Linha 8 } } /* * Instancia uma instância de Inner63; A. new Inner(); // Na linha 3 B. new Inner(); // Na linha 8 C. new o.Inner(); // Na linha 8 D. new Outer.Inner(); // Na linha 8 */
A resposta A.new Inner(); é equivalente a this.new Inner(); já existe um objeto da classe Outer.
line 8 A forma correta é: o.new Inner();
Isso é tudo o conteúdo deste artigo, esperamos que o conteúdo deste artigo possa ajudar você a aprender ou trabalhar, e também esperamos que você dê mais apoio ao tutorial de gritaria!
Declaração: o conteúdo deste artigo é extraído da internet, pertence ao respectivo proprietário, o conteúdo é contribuído e carregado voluntariamente pelos usuários da internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Aparentemente confirmado, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)