Duvidas com Classes Aninhadas

8 respostas
Doug_Floriano

Galera, vê se pode me ajudar...

Estava estudando e fazendo alguns testes com Classes Aninhadas, e fiz o código abaixo e compilei.
O problema (ou não) é que compilou e Executou, isso fazendo no pelo Prompt e executando o javac, tentei pelo Eclipse e dava erro.
Ao executar percebi 2 coisas que me deixaram com muitas duvidas.
Como pode a classe D extender a classe B, e mesmo extendendo, o super da classe D executar na Classe A?

Se alguém puder me ajudar, só para eu não ficar com duvidas referente a Classes Aninhadas.

Obs. Só funcionou executando pelo Prompt.

Falou.

class A{

	public A(){
		System.out.println("Classe_A_Construtor");
		B x = new B();
	}
	
	class B{
		public B(){
			super();
			System.out.println("Classe_B_Construtor");
		}
	}

}

class C{
	public C(){
		System.out.println("Classe_C_Construtor");
	}
	
	class D extends B{
		public D(){
			super();
			System.out.println("Classe_D_Construtor");	
		}
	}
}

class TesteClassesAninhadas{

	public static void main(String[] args){
		C i = new C();
		C.D x = i.new D();

	}
}

8 Respostas

LPJava

qual erro que dava no eclipse? copia e cola ai… lembrar que a class interna é-um membro da class externa… respondendo sua pergunta todos ai estao no mesmo package e outra um construtor chama o outro ate chega Object… apenas isso!..

Doug_Floriano

Classe_C_Construtor
[color=red]Exception in thread “main” java.lang.Error: Unresolved compilation problem:
B cannot be resolved to a type[/color]

[color=red]at C$D.<init>[/color][color=red] [/color](TesteClasses.java:23)
[color=red]at TesteClassesAninhadas.main[/color][color=red] [/color](TesteClasses.java:35)

//Entendi a sua resposta CamiloLopes , ajudou para tirar a duvida.
//Valeu.

neohacker

nesta parte vc precisa alterar:

class D extends B{

para

class D extends A.B{

porque a classe B é uma classe interna então vc precisar acessar pela classe externa…

tomara que eu não esteje errado…hehe

LPJava

vc nao pode acessar uma class interna diretamente nao… pois ela é-um membro da class encapsuladora… tenho q informar a class externa… espero tb estar certo… :?

Doug_Floriano

no caso de.

class D extends A.B

como o NeoHacker disse.

Eu só não acessaria a classe B com a classe A instaciada?
seria melhor então deixar a classe B static?

LPJava

o problema do static que ela nao tem instancia e so pode ser acessada por outro membro static… lembre-se nao existe class static… qdo vc poe o modificador static em uma class aninhada, so ta dizendo que seu membro é static é o mesmo que abaixo:

class Z{
 static int z;
}

o membro z da class Z é static… com class aninhadas nao muda nada a respeito mesma ideia…

Doug_Floriano

Fiz outros teste, deixando

class D extends A.B

Ao compilar, ja da erro, pois pede a intância da classe A, mas acho que isso não é possível.

até que deixando a classe B static rolou bem, e o super da classe D acessou a classe B direto.

mas acho que estou tentando só doideira, rsrss

é acho que preciso estudar muito mais esse “causos meio doidos” rsrs, valeu pelas dicas.

WellingtonRamos

Então,
A classe precisa ser static senão não rola.

Exemplo:
public class Main {
	public static void main(String[] args) {
		System.out.println(new T.K().teste());
		System.out.println(new Y().teste());
		System.out.println(new Y().outroTeste());
		
		System.exit(0);
	}
}


class T {
	static class K {
		int teste(){
			return 1;
		}
	}
}

class Y extends T.K {
	int teste(){
		return 2;
	}
	
	int outroTeste(){
		return new T.K().teste();
	}
}
Criado 16 de abril de 2007
Ultima resposta 24 de mar. de 2010
Respostas 8
Participantes 4