Inner Class

Ola Pessoal,

Estou estudando para certificacao e estou com uma duvida…

Essa linha não está instanciando a InnerTest class ?? Pergunto isso pois essa classe eh abstrata e classes abastratas nao podem ser instanciadas.
Test.InnerTest test=t.new InnerTest()…

Segue codigo completo abaixo.

Alguem pode me explicar melhor o que essa linha esta fazendo ??

abraco,

Dac

import java.util.*
public class Test
{
public abstract class InnerTest
{
abstract void f();
}
public stati void main (String[] args)
{
Test t = new Test();
Test.InnerTest test=t.new InnerTest()
{
public void f();
{
System.out.println(“Inner f”);
}
};
}

}

Veja o problema:

		Test.InnerTest test=t.new InnerTest()
		{
			public void f(); {
				System.out.println("Inner f");
			}
		};

Você está construíndo o método abstrato sob demanda que não deve ter “;”. Errado fazer isso: “f(); {”.

wiliamps

Desculpe falha minha de digitacao…nao tem esse ;

Resultado desse codigo ele roda mas nao imprimi nada…

Minha duvida eh…InnerTest eh uma classe abastrata pq ele ta instanciando ?? OU isso nao eh instanciar ???

[quote=edancam]Desculpe falha minha de digitacao…nao tem esse ;

Resultado desse codigo ele roda mas nao imprimi nada…

Minha duvida eh…InnerTest eh uma classe abastrata pq ele ta instanciando ?? OU isso nao eh instanciar ???[/quote]

Bem, não sei muito sobre o assunto que esta a estudar, mas classes abstratas não podem ser instanciadas.

Isso eu ja sabia, tanto é que coloquei no post original mas o que o cara ta fazendo aqui ???

Test.InnerTest test=t.new InnerTest()
{
public void f()
{
System.out.println(“Inner f”);
}
};

Isso nao eh instanciacao pq ele ta definindo como se fosse um metodo…alguem EXPERT pra me ajudar…isso eh pegadinha de certificacao…
Eu acho que o trecho acima eh diferente de :
Test t = new InnerTest(); //ISSO eh proibido…mas nao entendi o que ele ta fazendo no trecho cima…

Ao abrir chaves, você criou uma classe filha de InnerClass.

Ou seja, você criou uma class interna anônima da sua InnerClass, e fez ali a implementação do método f.

Esse tópico explica isso melhor:
http://www.guj.com.br/java/283407-duvida-declaracao-estranha#1496789

public class Test {
	
	public abstract class InnerTest { 
		abstract void f(); 
	} 

	public static void main(String[] args) {
		Test t = new Test(); 
        
		
		/*
		 * 
		 * Trata-se de uma classe abstrata interna anônima,
		 * Classe interna se instancia deste jeito, como é abstrata 
		 * é uma instancia anônima, pesquise sobre classes anônimas
		 * falow, cara!  
		 * */
		Test.InnerTest test=t.new InnerTest() { 

			public void f(){ 
				System.out.println("Inner f"); 
			}

		}; 
               //para imprimir o texto
		test.f();
	}

} 

Ele não imprimi por que você não chamou o método para imprimir.

InnerClass <> Abstract.

Abstrato é uma classe que tem “abstract” escrito nela. [=

Hebert, essa InnerTest eh uma classe abstrata: public abstract class InnerTest

Entáo isso nao eh considerado uma instanciacao ?

Pois nao podemos criar instancias de uma classe abstrata.

Obrigado a todos.

abraco,

Dac

Eh abstrata só que vc fez uma implementacao anônima ao invés da implementação tradicional, e faltou chamar o método f() que foi sobrescrito pela tua classe ao usar o new . Sem mudar o conceito q uma classe abstrata nunca poderá ser instanciada. vc fez a implementação dessa classe sem dar nome a ela por isso são chamadas anônimas.

qq vcoisa avise.

[quote=edancam]Hebert, essa InnerTest eh uma classe abstrata: public abstract class InnerTest

Entáo isso nao eh considerado uma instanciacao ?

Pois nao podemos criar instancias de uma classe abstrata.

[/quote]

Se tivesse lido a minha resposta e o post que indiquei, não estaria repetindo a pergunta.

Se eu perguntei é porque li e ainda fiquei com algumas duvida. As vezes precisamos entender do nosso jeito e precisamos de confirmações para estabelecer os fundamentos.

Nao quase nada de Java mas estou tentando aprender, e nao gostei nada da sua resposta.

De qualquer maneira obrigado !

dac

[quote=edancam]Se eu perguntei é porque li e ainda fiquei com algumas duvida. As vezes precisamos entender do nosso jeito e precisamos de confirmações para estabelecer os fundamentos.

Nao quase nada de Java mas estou tentando aprender, e nao gostei nada da sua resposta.
[/quote]

Desculpe.
Normalmente o pessoal faz uma pergunta mais específica, como “eu não entendi esse trecho da explicação” ou “isso ainda não ficou claro”.
Você simplesmente repetiu a pergunta, por isso, entendi que você sequer tinha aberto o conteúdo do link.

Eu sei que, via de regra, poucos abrem links e menos ainda se dão ao trabalho de ler quando o texto deles é tão grande.
Mas havia explicado recentemente sua dúvida, com muitos detalhes, pois ela é recorrente no fórum.

Concordo, é difícil obter uma boa resposta se não faz uma boa pergunta. Aliás, esta é uma das piores perguntas que já vi até agora no GUJ.

Ainda, não adianta ficar com tiradas do tipo alguém “EXPERT” pode ajudar, pois o colega nada mais tentou do que ajudar você e você complica com falta de paciência.

Vamos ao que interessa:

Repetiram N vezes que isso é uma criação de classe anônima. InnerTest é abstrata com certeza, por isso ao construir com NEW, você vê CLARAMENTE que a classe está sendo programada para ficar concreta e sua especialização não tem nome, por isso é ANÔNIMA.

Não é só isso, quando o runtime executar esta linha, vai fazer o de sempre: criar um endereço para a variável “Test.InnerTest test” e reservar um espaço na memória para comportar o objeto produzido pelo NEW que tem na sua frente a implementação de uma classe ANÔNIMA derivada de InnerTest.

Existem muitas técnicas em um só comando.

Se não ficou claro, recomendo você investir bastante em conhecer fundamento da computação antes de lidar com certificação de Java.

wiliamps