Classes internas

Olá pessoal

Estou agora estudando o capítulo de classes internas para a certificação SCJP e estou com uma dúvida. Dada a seguinte classe:

Os comentários são apenas para me guiar. Bom, é possível acessar uma variável de instância da classe externa a partir da classe interna, certo? E o contrário? Ou seja, acessar uma variável da classe interna a partir da externa sem ter que instanciar a interna? Por exemplo, acessar a variável w da classe interna. Se eu entendi, a classe interna tem um escopo diferente não acessível pela externa, é isso? Então para acessar a variável w só é possível pela instância da classe interna ou tornando ela estática?

Só tenho essa dúvida para concluir esse capítulo.

Desde já agradeço.

Você quer pegar uma perna do bebê sem que o bebê nem tenha sido gerado? É isso?

Estou estudando esse mesmo capitulo, pelo oq eu entendi, as variaveis de instancias da classe interna só vão estar acessiveis quando uma instancia dessa classe for criada. Para a instancia da classe interna ser criada, uma instancia da classe externa deve criar ela. Mesmo que a variavel seja marcada como static ela não vai estar acessivel, as variaveis e metodos static são carregados na primeira vez que a classe é estanciada, e se a classe nao for estanciada, as variaveis mesmo que estaticas nao vao estar carregadas.

Esta certo a minha resposta?? eu acho q é mais ou menos isso

Não, se as variáveis da classe interna são estáticas então você pode acessá-las normalmente. Membros estáticos ficam disponíveis após a carga da classe pela JVM, que pode ocorrer antes mesmo da criação da primeira instância. O simples fato de referenciar um membro estático de uma classe já é suficiente para a classe ser carregada.

[quote=bezier curve][quote]
Ou seja, acessar uma variável da classe interna a partir da externa sem ter que instanciar a interna?
[/quote]

Você quer pegar uma perna do bebê sem que o bebê nem tenha sido gerado? É isso?[/quote]

Ok amigo, entendi a questão. Li o objetivo novamente e consegui entender. Agora sobre classes internas locais de método. Uma classe interna não pode acessar as variáveis locais de método, salvo se ela for final. O que o final tem de especial nessa história? Outra questão: as variáveis de método não podem ser acessadas pela classe local de método porque o objeto da classe interna pode “sobreviver” mais tempo que o método. Tudo bem, faz sentido, pois o método pode ser finalizado e as suas variáveis são retiradas da pilha, sendo inexistentes ao objeto. Mas dado esse código:

Como eu poderia passar esse objeto cim fora desse método? Já que a classe interna ao método só é válida quando o método estiver executando, como poderia criar uma referência fora desse método à essa classe. Alguém pode dar um exemplo?

Desde já agradeço.

Bem camarada, concorda comigo que se você precisa usar um objeto dessa classe em um lugar externo ao método a classe não pode ser local ? Ou seja, a classe tem que ser declarada fora do método. Aí sim, dentro do seu método você cria o objeto e retorna ele.

Uma outra alternativa é retornar o objeto para uma referência a um supertipo da sua classe local. Porém, fora do método, você não conseguirá fazer o cast novamente para a classe local, pois ela é visível somente dentro do método. Mas sinceramente, não consigo imaginar um cenário onde isso seja útil.

public class Teste
{

public Object metodo()
{
	
	class ClasseInternaMetodo
{
		
		public void verAlgo()
		{
			final int var = 10;
			System.out.println(var);
		}
	}

	ClasseInternaMetodo cim = new ClasseInternaMetodo();
	Object a = cim;
	return a;
}

acho q entendi isso, vc pode passar a referência da classe interna do metodo para um supertipo dessa classe, no caso Object, porem eu não posso acessar os metodos da classe interna com a referência do tipo Object e nem converter ela de volta para o tipo ClasseInternaMetodo fora do metodo?? no caso em outra classe.

public static void main(String args[])
{
Teste a = new Teste();
Object b = a.metodo();
b.verAlgo() // aqui na consigo acessar os metodos da ClasseInternaMetodo
ClasseInternaMetodo c = (ClasseInternaMetodo) b; //isso também não funciona
}

Na verdade aqui eu errei. Acontece que nem mesmo é possível declarar membros estáticos em uma classe interna. Isso causa erro de compilação.