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???
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:
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
gumatias
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
Arnaldo_Caetano
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:
publicclassCar{publicstaticclassEngine{Engine(){System.out.println("default constructor");}}publicstaticvoidmain(String[]args){newCar().go();// Instancia de Engine sem criar Car.newCar.Engine();}voidgo(){newEngine();}privatevoiddrive(){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.