Java Inner Class, um conceito semelhante também é encontrado em C ++, ou seja, classe aninhada. À primeira vista, as classes internas podem parecer um pouco redundantes, e sua utilidade pode não ser tão significativa para iniciantes, mas com uma compreensão profunda disso, você descobrirá que os designers de Java são realmente bem-intencionados em classes internas. Aprender a usar classes internas faz parte do domínio da programação Java avançada, o que permite projetar a estrutura do seu programa com mais elegância. Os seguintes são introduzidos nos seguintes aspectos:
Primeira reunião
Conteúdo público da interface {int value ();} destino de interface pública {string readlabel ();} classe pública bens {classe privada conteúdo implementa conteúdo {private int i = 11; public int value () {return i; }} classe protegida gDestination implementa o destino {Private String Label; gDestinação privada (string whereto) {etiqueta = whereto; } public string readLabel () {return Label; }} Public Destination Dest (strings) {retorna novos gdestinação (s); } public content content () {return new Content (); }} classe testgoods {public static void main (string [] args) {bens p = new bens (); Conteúdo c = p.cont (); Destino d = p.Dest ("Pequim"); }}Neste exemplo, o conteúdo das classes e o GDestination são definidos dentro das mercadorias de classe e têm modificadores protegidos e privados, respectivamente, para controlar o nível de acesso. O conteúdo representa o conteúdo das mercadorias, enquanto o GDestinação representa o destino das mercadorias. Eles implementam duas interfaces de conteúdo e destino, respectivamente. No método principal abaixo, use o conteúdo C e o destino D diretamente para operar, e você nem vê os nomes dessas duas classes internas! Dessa maneira, é refletido o primeiro benefício das classes internas - ocultando operações que você não deseja que os outros saibam, ou seja, encapsulamento.
Ao mesmo tempo, também descobrimos o primeiro método para obter objetos de classe interna fora do escopo da classe externa, ou seja, para usar os métodos de sua classe externa para criar e retornar. É assim que os métodos cont () e dest () no exemplo acima fazem. Então, existe alguma outra maneira? Obviamente, o formato de sintaxe é o seguinte:
OuterObject = New OuterClass (parâmetros do construtor); OuterClass.innerClass iNnerObject = OutroBject.New InnerClass (parâmetros do construtor);
Observe que, ao criar objetos não estáticos de classe interna, você deve primeiro criar os objetos de classe externa correspondentes. Quanto ao motivo, também leva ao nosso próximo tópico-
Os objetos não estáticos da classe interna têm referências aos seus objetos de classe externa
Uma pequena modificação para o exemplo agora:
Public classe bens {private valuerate = 2; classe privada conteúdo implementa o conteúdo {private int i = 11*valueate; public int value () {return i; }} classe protegida gDestination implementa o destino {Private String Label; gDestinação privada (string whereto) {etiqueta = whereto; } public string readLabel () {return Label; }} Public Destination Dest (strings) {retorna novos gdestinação (s); } public content content () {return new Content (); }}A parte modificada é mostrada em vermelho. Aqui, adicionamos uma variável de membro privado avaliado à classe de mercadorias, o que significa o coeficiente de valor das mercadorias. Multiplique quando o valor do método de conteúdo interno da classe () calcula o valor. Descobrimos que o valor () pode acessar o valorate, que também é o segundo benefício das classes internas - um objeto de classe interna pode acessar o conteúdo do objeto de classe externa que o criou, mesmo incluindo variáveis privadas! Esse é um recurso muito útil que nos fornece mais idéias e atalhos ao projetar. Para implementar essa função, o objeto de classe interna deve ter uma referência ao objeto de classe externa. Quando o compilador Java cria um objeto de classe interna, ele passa implicitamente a referência ao seu objeto de classe externa e o salva o tempo todo. Isso permite que objetos de classe interna sempre acessem seus objetos de classe externa, e é também por isso que fora do escopo de ações de classe externa, o objeto de classe externa deve ser criado primeiro.
Algumas pessoas podem perguntar: e se uma variável de membro em uma classe interna for a mesma que uma variável de membro em uma classe externa, ou seja, uma variável de membro de mesmo nome na classe externa está bloqueada? Tudo bem, Java usa o seguinte formato para expressar referências a classes externas:
Outerclass.This
Com isso, não temos medo de tais situações de bloqueio.
Classe interna estática
Como classes comuns, as classes internas também podem ser estáticas. No entanto, em comparação com as classes internas não estáticas, a diferença é que as classes internas estáticas não têm referências ao exterior. Na verdade, isso é muito semelhante às classes aninhadas em C ++. A maior diferença entre as classes internas de Java e as classes aninhadas de C ++ é se existem referências ao exterior. Obviamente, há uma diferença da perspectiva do design e alguns detalhes.
Além disso, em qualquer classe interna não estática, não pode haver dados estáticos, métodos estáticos ou outra classe interna estática (a classe interna pode ser aninhada mais de uma camada). No entanto, as classes internas estáticas podem ter tudo isso. Esta também é a segunda diferença entre os dois.
Classes internas locais
Sim, as classes internas do Java também podem ser locais e podem ser definidas dentro de um método ou mesmo em um bloco de código.
classe pública bens1 {public Destination dest (strings s) {classe gDestination implementa Destination {Private String Label; gDestinação privada (string whereto) {etiqueta = whereto; } public string readLabel () {return Label; }} retornar novo (s) gDestination (s); } public static void main (string [] args) {bens1 g = new bens1 (); Destino d = g.Dest ("Pequim"); }}Este é um exemplo acima. No método destin, definimos uma classe interna e, finalmente, esse método retorna o objeto dessa classe interna. Isso pode ser feito se precisarmos criar apenas um de seus objetos e criá -los para o exterior ao usar uma classe interna. Obviamente, as classes internas definidas nos métodos podem diversificar projetos, e o objetivo não é apenas nesse sentido.
Aqui está um exemplo mais bizarro:
classe pública bens2 {private vazio internotracking (boolean b) {if (b) {class rastretingslip {private string id; Rastrearslip (strings s) {id = s; } String getsLip () {return id; }} RastreingsLip ts = new rastretingslip ("deslize"); String s = ts.getslip (); }} public void Track () {internalTracking (true); } public static void main (string [] args) {bens2 g = new bens2 (); G.Track (); }}Você não pode criar um objeto dessa classe interna fora do IF, porque isso está além do seu escopo. No entanto, ao compilar, o intervalo de rastreamento interno é compilado ao mesmo tempo que outras classes, mas é inválido se exceder esse escopo devido ao seu próprio escopo. Além disso, não é diferente de outras classes internas.
Classe interna anônima
As regras de sintaxe das classes internas anônimas de Java parecem um pouco estranhas, mas como matrizes anônimas, quando você só precisa criar um objeto de uma classe e não pode usar seu nome, o uso de uma classe interna pode fazer com que o código pareça conciso e claro. Suas regras de sintaxe são as seguintes:
new interfacename () {......}; ou novo superclassName () {......};Vamos continuar a dar um exemplo:
classe pública bens3 {public content content () {return new contents () {private int i = 11; public int value () {return i; }}; }}Aqui, o método cont () usa uma classe interna anônima para retornar diretamente um objeto que implementa a classe do conteúdo da interface, que parece muito conciso.
No adaptador anônimo para processamento de eventos em Java, as classes internas anônimas são amplamente utilizadas. Por exemplo, quando você deseja fechar a janela, adicione este código:
frame.addwindowlistener (new windowAdapter () {public void WindowClosing (WindowEvent e) {System.exit (0);}});Uma coisa a observar é que, como a classe interna anônima não tem nome, ela não possui um construtor (mas se essa classe interna anônima herda uma classe pai que contém apenas um construtor com argumentos, você deve trazer esses parâmetros ao criá -lo e usar a palavra -chave para chamar o conteúdo correspondente durante o processo de implementação). Se você deseja inicializar suas variáveis de membros, existem várias maneiras:
Se for uma classe interna anônima de um método, você pode usar esse método para passar os parâmetros desejados, mas lembre -se de que esses parâmetros devem ser declarados finais.
Reforma da classe interna anônima em uma classe interna local nomeada para que possa ter um construtor.
Use blocos de código de inicialização nesta classe interna anônima.
Por que as classes internas precisam?
Quais são os benefícios das classes internas do Java? Por que as classes internas precisam?
Primeiro, vamos dar um exemplo simples. Se você deseja implementar uma interface, mas um método nessa interface tem o mesmo nome e parâmetros que um método na classe que você imaginou, o que você deve fazer? No momento, você pode criar uma classe interna para implementar essa interface. Como a classe interna é acessível a todo o conteúdo da classe externa, isso pode realizar todas as funções que você implementa diretamente essa interface.
Mas você pode ter que questionar, não é suficiente mudar o método?
De fato, é realmente pouco convincente usar isso como um motivo para projetar categorias internas.
A verdadeira razão é que as classes e interfaces internas em Java são combinadas para resolver um problema que geralmente é reclamado pelos programadores C ++ - não há mais herança. De fato, a multi-aprimoramento de C ++ é muito complicada de design, e o Java pode alcançar o efeito da multi-aprimoramento por meio de classes e interfaces internas.
Resumo da classe interna Java
(1) classe interna não estática definida entre métodos:
● As classes periféricas e internas podem acessar seus próprios membros particulares um do outro.
● As variáveis estáticas de membros não podem ser definidas na classe interna.
Fora do escopo da classe externa, para criar um objeto de classe interna, você deve primeiro criar seu objeto de classe externa
(2) classe interna estática definida entre métodos:
● Somente membros estáticos de classes externas podem ser acessados.
A classe interna estática não tem referências ao exterior
(3) classe interna local definida no método:
● Esta classe interna não possui permissões de controle de acesso
● A classe periférica não pode ver a classe interna local no método, mas a classe interna local pode acessar qualquer membro da classe periférica.
● As classes internas locais podem ser acessadas no corpo do método, mas a declaração de acesso deve ser após definir as classes internas locais.
● As classes internas locais só podem acessar constantes no corpo do método, ou seja, os membros modificados com o final.
(4) classe interna anônima definida no método:
● Não há construtor, em vez de passar os parâmetros do construtor para o construtor de superclasse
Quando você só precisa criar um objeto de uma classe e não usar seu nome, o uso de classes internas anônimas pode fazer com que o código pareça conciso e claro.
O artigo acima entende de forma abrangente aulas internas e anônimas em Java é todo o conteúdo que compartilhei com você. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.