Como acessar variaveis de metodo

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.

:wink:

Autor, qual a resposta?

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