Em “method” da classe Minner da erro qdo tento pegar quais variaveis? e pq da erro??
public class MOuter{
private int m = (int) (Math.random()*100);
public static void main(String args[]){
MOuter that = new MOuter();
that.go((int) (Math.random()*100),(int) (Math.random()*100));
}
public void go (int x, final int y) {
int a = x+y;
final int b = x-y;
class Minner{
public void method(){
System.out.println("m is "+m);
System.out.println("x is "+x);
System.out.println("y is "+y);
System.out.println("a is "+a);
System.out.println("b is "+b);
}
}
Minner that = new Minner();
that.method();
}
}
Essa é boa… inclusive já teve um tópico parecido em que eu respondi essa pergunta… inclusive estou usando parte da resposta de lá…
Vamos lá…
Regra 1: A classe declarada dentro do método só é visivel dentro dele.
Regra 2: A classe declarada dentro do método só pode acessar atributos com escopo de classe, ou atributos declarados dentro do método, mas este deve ser final e por último, pode tb acessar os parâmetros do método, deste que sejam finais.
A regra 1 é bem óbvia. É como o conceito de escopo de método, ou seja, se ela foi declarada dentro do método só vai existir lá dentro.
Agora a regra 2, tem que pensar um pouco mais… Vou dar um exemplo (que é baseado no livro da Katia, Certificação). Imagine o seguinte, vc tem um objeto na classe principal (no seu exemplo é o MOuter). Vc pode acessar este objeto na classe declarada dentro do método (conforme regra 2). Agora imagine dentro do método (no qual foi declarada a classe Minner) tivesse um outro objeto, e este consequentemente pudesse ser atribuído ao objeto de foi declarado na classe principal (MOuter). Ia acontecer que, quando o método fosse finalizado a referência para o objeto declarado dentro dele tb ia pro “espaço”, consequentemente o objeto da classe principal que o recebeu teria uma referência inválida… por isso que que existe a regra 2.
Vai dar erro de compilação nas tentativas de imprimir as variáveis “x” e “a” dentro da classe Minner. Como as variáveis são locais do método “go” que encapsula a classe Minner, elas devem ser declaradas “final”.
Robson