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?
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?
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
}