Inner class

Pessoal bom dia, não estou conseguindo entender pq esse codigo nao compila, tem como me ajudarem?

[code]public class MyThread {

int numero = 0;

static class M extends MyThread{
	
	void go(){
		System.out.println(numero);
	}
	
}

class A  extends MyThread{
	
	void go(){
		System.out.println(numero);
	}
	
}

static class C extends A{ // erro de compilação aqui.
	
	static{
		System.out.println("block static");
	}
	
}[/code]

Na próxima manda a mensagem de erro.
Me parece que uma inner class static não pode estender uma inner class não-static.
Não cheguei a testar ou pesquisar, mas me parece ser isso. Não consegui ver outro motivo.

[quote=pjota]Na próxima manda a mensagem de erro.
Me parece que uma inner class static não pode estender uma inner class não-static.
Não cheguei a testar ou pesquisar, mas me parece ser isso. Não consegui ver outro motivo.[/quote]

Não tem nda haver o que vc falou.

O motivo é que você precisa de uma instância da classe de fora, para poder criar a classe A. Como C estende A, essa regra também vale para C.

Para corrigir, você teria que fazer essa bizarrice aqui:

[code]
public class MyThread {
int numero = 0;

static class M extends MyThread{
void go(){
System.out.println(numero);
}
}

class A extends MyThread{
void go(){
System.out.println(numero);
}
}

static class C extends A{ // erro de compilação aqui.
static{
System.out.println(“block static”);
}

  public C() {
     new MyThread().super();
  }

}
}[/code]

Nem preciso dizer que esse código não é recomendado, preciso?

A pergunta é pra você saber ou pra testar o fórum?

Isolando o assunto “inner class estendendo indiretamente sua outer class” do “static class estendendo uma não-static”.
O código abaixo apresenta o mesmo erro na mesma linha.

[code]public class MyThread {

	int numero = 0;  
 	
 	static class M /*extends MyThread*/ {  
       
        void go(){  
            //System.out.println(numero);  
        }  
         
   }  
     
   class A /*extends MyThread*/ {  
         
       void go(){  
          //System.out.println(numero);  
       }  
         
   }  
     
   static class C extends A {   
         
       static{  
           System.out.println("block static");  
       }  
         
   }  

}[/code]

Transforme a classe A em static e tudo funciona.

Sendo a classe A não-static e C static, C não faz uma chamada ao construtor da superclasse. Daí o erro:
“No enclosing instance of type MyThread is available due to some intermediate constructor invocation”

Não entendi direito o erro :(, porque a classe C é statica e não precisa de uma instancia da classe de fora pra poder cria-la não e n?

Quando eu instancio C ele iria chamar o Construtor de A que por sua vez iria chamar o de MyThread nao seria isso n?

Ficaria assim:

Tem como me explicar esse construtor aqui tb?

public C() { new MyThread().super(); }

Sim, mas ela é filha de uma classe não estática.

Como ela é filha, quem vai precisar da instância é a parte “A” de “C”.

1º Hum, entao ele nao iria chamar nem o construtor de A nem de MyThread, por falta dessa instancia da classe de fora né?

2º Agora num entendi o uso desse construtor, pra solução do problema:

public C() { new MyThread().super(); // instancia MyThread e o .super() chama o construtor do pai de MyThread? }

O construtor da classe A precisa de uma instância de MyThread para funcionar. Como A é uma classe não estática, ela pertence ao domínio da instância, não da classe.

Aquele construtor de C, fornece essa instância para que A possa operar. Como C é uma classe estática, a instância de my thread não existe, e o construtor de A não poderia funcionar com uma simples chamada a super. Aquilo ali, apenas permite que você forneça explicitamente que instância é essa.

Agora, essa “correção” tá mais pra gambi. É o tipo de coisa que apesar de possível é uma abominação, e deve ser mais exceção do que regra.
Por mim, a sun não teria admitido essa forma, e teria dado um erro do tipo “Ei meu filho, criar uma static inner class a partir de uma não static é uma imensa cagada.”

[quote=ViniGodoy]O construtor da classe A precisa de uma instância de MyThread para funcionar. Como A é uma classe não estática, ela pertence ao domínio da instância, não da classe.

Aquele construtor de C, fornece essa instância para que A possa operar. Como C é uma classe estática, a instância de my thread não existe, e o construtor de A não poderia funcionar com uma simples chamada a super. Aquilo ali, apenas permite que você forneça explicitamente que instância é essa.

Agora, essa “correção” tá mais pra gambi. É o tipo de coisa que apesar de possível é uma abominação, e deve ser mais exceção do que regra.
Por mim, a sun não teria admitido essa forma, e teria dado um erro do tipo “Ei meu filho, criar uma static inner class a partir de uma não static é uma imensa cagada.”[/quote]

Hum, ele usa essa instancia do construtor pra criar A então, agora pq tem que usar o .super()? Eu vi aqui que nao compila sem ele.

É pq não existe um super sem parâmetros na classe A. Isso aí é uma forma disfarçada de:

Implicitamente, todo construtor de uma classe interna não estática aceita como parâmetro o this da classe que a agrupa.
Tudo isso por baixo dos panos. Por isso ela pode acessar métodos e propriedades da classe externa.

É pq não existe um super sem parâmetros na classe A. Isso aí é uma forma disfarçada de:

Implicitamente, todo construtor de uma classe interna não estática aceita como parâmetro o this da classe que a agrupa.
Tudo isso por baixo dos panos. Por isso ela pode acessar métodos e propriedades da classe externa.[/quote]

Nossa fino de mais.

Essa sintaxe:
new MyThread().super(); é igual a essa super(new MyThread()) ? Em todos casos ou so em inner?

Por exemplo se eu fizer, new Teste().super(), vou estar passando pra Pai de Teste um objeto Teste?

Só na inner.

Em nenhum outro caso fora de inner class então, não funciona uma sintaxe dessa?

[quote=evertonsilvagomesjava]Em nenhum outro caso fora de inner class então, não funciona uma sintaxe dessa?

[/quote]

Que eu saiba não só não é possível, como também não é necessário.

[quote=ViniGodoy][quote=evertonsilvagomesjava]Em nenhum outro caso fora de inner class então, não funciona uma sintaxe dessa?

[/quote]

Que eu saiba não só não é possível, como também não é necessário.[/quote]

kkk muito maluco, nao sabia dessa do .super(), vlw Vini. Pra mim era super() dentro do construtor chamando o construtor da super class, ou entao um super. pra acessar algum membro ou atributo da classe super rs.