/ / Classes aninhadas Java- sob o capô? - java

Classes aninhadas em Java - sob o capô? - java

Eu tenho algumas perguntas relacionadas a classes aninhadas em Java.

  • Como as classes aninhadas aparecem "sob o capô", no que diz respeito às alocações de memória?

  • Você não pode declarar uma variável estática dentro de umclasse aninhada (acho que o erro exato foi que os atributos estáticos só podem ser declarados na classe de nível superior). Por que isso e quais outras restrições existem para classes aninhadas?

Se possível, diga se sua resposta é específica para Java ou se C ++ também segue as mesmas regras?

Respostas:

1 para resposta № 1

As classes internas são exatamente as mesmas que as regularesclasses no que diz respeito à memória e compilação. (Talvez haja alguma diferença na maneira como são gerenciados na memória, mas não é visível para o desenvolvedor Java médio). Na verdade, quando você compila uma classe que possui uma classe interna, é possível ver o arquivo .class compilado. Como OuterClass$InnerClass.class. Então, até onde eu sei, a JVM os trata da mesma forma.

No que diz respeito às variáveis ​​estáticas, não estou certo de qual é o problema. Por exemplo, isso corre para mim:

public class Tester {
public static void main(String[] args) {
System.out.println(InnerTester.MY_STRING);
}

public class InnerTester {
public static final String MY_STRING = "MY_STRING";
}
}

EDITAR

Como Jeffery apontou, isso NÃO compila:

public class Tester {
public static void main(String[] args) {
System.out.println(InnerTester.MY_STRING);
}

public class InnerTester {
public static String MY_STRING = "MY_STRING";
}
}

A diferença é que tive a primeira variável estática listada como final.

Depois de pensar sobre isso por um tempo, eu concordo com @ Eugene. Eles permitem que campos estáticos em classes internas sejam final porque então não há problema com a inicialização. O valor não podes mudar, basta inicializá-lo para o seu valor. Se, no entanto, o campo estático não final, então você precisa de um instância da classe externa a ser criada para inicializar o campo, e os membros estáticos não podem ser ligados a instâncias particulares.

eu encontrei esta discussão sobre isso também.


1 para resposta № 2

Basicamente, uma classe aninhada é apenas uma classe com um campo referenciando a instância envolvente.

A menos que seja uma classe aninhada estática (dentro da qual você pode declarar campos / métodos estáticos). Neste caso, é apenas uma classe com outro elemento de caminho no nome (package + enclosing class name).

Em outras palavras. Classe aninhada não estática (classe interna) - não pode existir sem incluir a instância (por exemplo, página dentro de um livro). E você instancia da seguinte maneira:

 Book book = ... // a book instance;
Book.Page page = book.new Page(); // requires an enclosing instance

Mas a classe estática aninhada - é completamente independente, é como apenas uma questão de espaço de nome. Você pode instanciá-lo como:

 Outer.NestedStatic instance = new Outer.NestedStatic(); // just name-space

Mais informações aqui: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


0 para resposta № 3

Uma classe aninhada é simplesmente a definição de um tipo dentro de outra classe. Java não se importa em qual escopo um novo tipo é definido, e você não precisa "manipular" essa classe interna de maneira especial.

Não faria sentido ter uma classe interna não-estática com campos estáticos, uma vez que qualquer referência a uma classe interna não-estática é necessariamente uma variável de instância. Somente se a classe interna é feita static seria até mesmo possível estaticamente atribuí-lo - neste caso, a classe interna estática é uma classe autônoma, com o nome da classe envolvente agindo como ainda outro nível de espaço para nome.