O que realmente acontece nesse código?

6 respostas
M
public class OuterClass {
	int num = 3;

	void displayNum(int num) {
		System.out.println(num);
	}

	void testLocalClassAccess() {

		class LocalClass {
			{

				displayNum(num);
			}
			LocalClass(){
				System.out.println("2");
			}
		}
		new LocalClass() {
			{
				System.out.println("test");
			}
		};
	}
}
class TestLocalClassAcessClass {

	
	public static void main(String[] args) {
		OuterClass outerClass = new OuterClass();
		outerClass.testLocalClassAccess();

	}

}

Output:

3
2
Test

A classe anônima está instanciando LocalClass?
Eu sei que, a classe anônima vira subclasse de LocalClass no código.

Parece que, sendo a classe anônima uma subclasse de LocalClass, a classe anônima chama o código de construção (constructor code) de LocalClass.

O inicializador de instâncias (que chama ‘displayNum(num);’) corre junto com o código de construção de LocalClass?

Alguém sabe, o que realmente acontece quando a classe anônima é invocada?

Obrigado.

6 Respostas

SierraEx

Se não me engano, logo ao chamar testLocalClassAccess(), é declarado a classe anônima e, logo após, criado um objeto do tipo LocalClass, então, logo após a instrução super() do construtor, é invocado o inicializador de instâncias que imprime 2, depois é chamado System.out.println(“2”) no construtor, agora fiquei com dúvida na execução de System.out.println(“test”), e não entendi a sintaxe new LocalClass() {}; , também gostaria de aprender

rogelgarcia

Tanto esse código:

{
				
				displayNum(num);
			}

Quanto esse código:

LocalClass(){
				System.out.println("2");
			}

Fazem parte do construtor da classe LocalClass…

É como se houvesse um único construtor assim:

LocalClass(){
				displayNum(num);
				System.out.println("2");
			}
rogelgarcia

.

ruivo

rogelgarcia:
Tanto esse código:

{
				
				displayNum(num);
			}

Fazem parte do construtor da classe LocalClass…

É como se houvesse um único construtor assim:

LocalClass(){ displayNum(num); System.out.println("2"); }

Infelizmente, vc não está correto. o primeiro código mencionado é um “Instance Initializer”, não faz parte do construtor.
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6

Já o

new LocalClass() {}

você está declarando e instanciando uma classe anônima, que estende LocalClass.

M

Legal.

Acho que é isso mesmo.

Valeu :slight_smile:

rogelgarcia

ruivo:
rogelgarcia:
Tanto esse código:

{
				
				displayNum(num);
			}

Fazem parte do construtor da classe LocalClass…

É como se houvesse um único construtor assim:

LocalClass(){ displayNum(num); System.out.println("2"); }

Infelizmente, vc não está correto. o primeiro código mencionado é um “Instance Initializer”, não faz parte do construtor.
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6

Já o

new LocalClass() {}

você está declarando e instanciando uma classe anônima, que estende LocalClass.

Obrigado pela dica… procurei essa referencia mas nao encontrei…

De qualquer maneira, o código que apresentei como resultado final está correto. Ou seja, os dois blocos são combinados no construtor na compilação.

Criado 2 de outubro de 2012
Ultima resposta 3 de out. de 2012
Respostas 6
Participantes 4