Sobre Classes abstratas e classes dentro de classes

Tenho uma classe abstrata PRINCIPAL, e as derivadas D1, D2, D3.
E a classe derivada D1 tem uma classe interna A.
Algo assim:


class abstract PRINCIPAL {
}

class D1 extends PRINCIPAL{
  class A{
  }
}

class D2 extends PRINCIPAL{
}

class D3 extends PRINCIPAL{
}

e preciso acessar a classe A, mas não estou conseguindo com a instancia do D1

 d1.A; //Não acessa.. até roda mas enxerga null 

O único jeito mesmo é colocar A dentro de PRINCIPAL? Não tem como eu acessar A dentro de D1?
Porque não faz sentido A fica em PRINCIPAL já que D2, D3 e outras não vão utilizar A para nada…

Cara,

Não sei se eu entendi direito o que você quis dizer, mas a Classe A é uma classe, portanto, para criar um objeto desta classe teria que fazer

D1.A obj = new D1().new A();

(Bem, se eu me lembro bem era assim, rs.)

Ainda fico com dúvidas se era isto que você queria saber…

Olá, wellington7!
Olha, classes internas (inner classes) é um assunto meio intrincado…
Quando você tem uma classe D1, a qual tem uma inner class A, só conseguimos obter uma instância de A se, primeiro de tudo, A for acessível, segundo se tivermos antes uma instância da classe detentora, que neste caso é a D1. E a bizarrice não para por aí! o [i]new[/i] deve ser dado “a partir” da instância de D1!!! Confuso? Olhe só como fica essa brincadeira:

D1 d1 = new D1();
D1.A a = d1.new A();

Louco, né mesmo?
Divirta-se!

Cara, não sei se entendi direito o que vc precisa, é mais ou menos isso?

abstract class PRINCIPAL {
 	public void Generico(){};
 }
 
class D1 extends PRINCIPAL{
 	public void Generico() {
 		System.out.println("implementar");
 	}
class A{
   	public void testeInterno(){
   		System.out.println("Teste de classe interna");
   	}
   }
 }
 
 public class ClasseInterna {
	
	public static void main (String [] args){

       D1 d1 = new D1();
       D1.A ci = d1.new A();
       ci.testeInterno();
       		
	}
}

para acessar a class interna partir de outra class vc precisa ter uma instanca da class que a engloba e depois criar uma instancia da classe interna como a galera falou acima… de forma direta nao tem como nao… a class interna é-um-membro da class externa, é como se fosse um metodo, uma variavel de instancia… vc nao pode acessar um metodo nao static, dentro de um metodo static se vc nao criar uma instancia da class aonde está o metodo certo? as classes interna funciona da mesma forma…

Desculpe, esqueci de dizer que o construtor das classes já está instanciando as derivadas


 class abstract PRINCIPAL {

    Public PRINCIPAL(){
[b]        D1 d1 = new D1();[/b]
        (...)
    }

 }
 
 class D1 extends PRINCIPAL{
[b]   A a = new A();[/b]
   class A{
   }
 }
 
 class D2 extends PRINCIPAL{
 }
 
 class D3 extends PRINCIPAL{
 }

Estava tentando acessar o objeto a usando

 objPrincipal.objD1.objA;

Mas ele não enxergava objA, nao sei pq…

Só consegui qnd criei um método getObjD1

 objPrincipal.getObjD1().objA;

OBS. Todos eram públicos, mesmo assim só consegui com o get
E tive que colocar o get na classe abstrata PRINCIPAL. Ou seja, não consigo acessar nada das derivadas que não esteja declarado na abstrata PRINCIPAL. Por isso consegui com o método.

Obrigado a todos!