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]
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”
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?
[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.