Inner Classes

5 respostas
G

Ola pessoal, estou com uma duvida bem besta que encontrei no teste que fiz, apesar de ter acertado quando botei pra rodar nao entendi mt bem…

public class Car{ class Engine{ // insert code here } public static void main(String[] args){ new Car().go(); } void go(){ new Engine(); } void drive(){ System.out.println("hi"); } }

ele roda normal se eu colocar:

{ Car.this.drive(); }

mas eu gostaria de saber o porque que quando eu tiro as chaves internas e deixo somente, Car.this.drive(); ele da erro de compilacao? O que que essas chaves em volta do Car.this.drive(); diferenciam???

5 Respostas

A

O bloco de código que você está colocando na classe Engine é um Instance Initializer. Este bloco de código é executado quando uma instancia da classe Engine é criada.
Se a classe Engine tivesse um construtor default por exemplo, a cada new Engine() tanto o bloco de inicialização de instância quanto o código do construtor default seria executado.
Exemplo:

public class Car{   
    class Engine{   
    	{Car.this.drive();}
    	Engine(){
    		System.out.println("default constructor");
    	}
    }   
    public static void main(String[] args){   
        new Car().go();   
    }   
    void go(){   
        new Engine();   
    }   
    void drive(){ System.out.println("hi"); }   
}

Saída:
hi
default constructor

Se você tira as chaves você está gerando um erro de sintaxe, pois ela espera dentro da classe declaração de variáveis, métodos, construtores e blocos de inicialização, etc exceto uma linha de comando.

G

Valeu cara! me ajudou muito.

rafaelsantos1983

Uma dúvida pequena. A classe interna só consegue usar a sintaxe “Car.this.” no bloco de inicialização para acessar ao método de Car, por que Car é a classe que tem a classe Engine, certo né?
Então não precisa criar uma instância da classe Car, para Engine acessar algum método de Car, isso também vale para métodos privates?

A

A classe Engine não está declarada como static. Seria possível declará-la como static! Como static seria possível se ter uma classe Engine sem uma classe Car, e somente métodos e variáveis static estariam acessíveis para Engine. Veja o exemplo:

public class Car{
    public static class Engine{
        Engine(){
            System.out.println("default constructor");
        }
    }

    public static void main(String[] args)
    {
        new Car().go();
        // Instancia de Engine sem criar Car.
        new Car.Engine();
    }

    void go()    {
        new Engine();
    }

    private void drive()    {
        System.out.println("hi");
    }
}

Na questão do post a inner class Engine só poderá ser criada a partir de uma instância de uma classe Car, por este motivo o Car.this é acessível em Engine.

Para criar uma instância de Engine fora da classe Car seria necessário executar:

Veja o exemplo:

public class Teste { public static void main(String[] args) { new Car().new Engine(); } }

rafaelsantos1983

hummm não sabia que uma classe poderia ser static, no caso só a classe Inner.

Criado 25 de janeiro de 2009
Ultima resposta 26 de jan. de 2009
Respostas 5
Participantes 3