[RESOLVIDO] Herança interna

8 respostas
tabocu
public class teste2 {
	
	public class A extends teste2{
		
		public class B extends A{//Aqui

			
		}
		
		public class C extends A{//Aqui

		
		}
	}
	
	public class B extends teste2{

	}
}

Gente, da uma olhada nesse código
ta indicando erro nos lugares comentados com //Aqui

Erro indicado pelo eclipse: No enclosing instance of teste2 is available due to some intermediate constructor invocation

Alguem sabe porque e se tem como contornar?

8 Respostas

tabocu

Alguem?

nel

1 - Só pode haver uma única classe pública por arquivo

2 - Além disso, declarou que a classe B extende em um momento a Classe A e em outro momento a classe Teste2. Isso só seria possível se fossem em packages distintos, pois caso contrário, não existe multipla herança em Java.

tabocu

Nel, descobri o problema, na verdade pode ter mais uma classe publica sim. Desde que somente a mais externa seja pública. E podem ter nomes iguais desde que nao pertenção ao mesmo encapsulamento.

teste esse codigo já com a solução:

public abstract class teste2 {
	
	public abstract class A extends teste2{
		
		public class B extends A {
			B(){
				A.this.super();
			}
			
		}
		
		public class C extends A{
			C(){
				A.this.super();
			}
		
		}
	}
	
	public class B extends teste2{

	}

}
FelipeGalli

Isso que você está fazendo é o famoso “Diamente da morte” em C++ ou seja Herança múltipla…

Imagine que Teste2 tem um mesmo método que a classe A… qual a classe B iria pegar ???

Abraços

tabocu

Nao acontece herança multipla de forma alguma

São classes diferentes.

Mas enfim sómudar o nome da classe, esse nao e meu foco e sim a classe dentro de classe

nel

tabocu:
Nao acontece herança multipla de forma alguma

São classes diferentes.

Mas enfim sómudar o nome da classe, esse nao e meu foco e sim a classe dentro de classe

Concordo, olhando com mais calma trata-se de classes externas e não ocorre multipla herança, até porque, não iria compilar.
Agora me explica, fazendo o favor, o motivo dessa “bagunça” ai :slight_smile:

tabocu

Claro, o motivo é algo parecido com a classe Point2D
não posso postar o código em sim porque trata-se de um programa restrito em desenvolvimento para Cemig

Como vc pode ver em Point2D
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/awt/geom/Point2D.java

vc chama ela da seguinte forma:

Point2D p = new Point2D.Double(x,y);
Point2D p = new Point2D.Float(x,y);

é mais um questão de organização do código e facilidade de interação.

Outro motivo seria pelo aprendizado, queria saber como é possível.

adriano_si

Confesso que nunca havia imaginado um uso pra inner classes dessa forma…

Qual a real vantagem de fazer assim ??? Apenas economizar quantidade de Arquivos ???

Abs []

Criado 6 de abril de 2011
Ultima resposta 6 de abr. de 2011
Respostas 8
Participantes 4