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?
Você quer pegar uma perna do bebê sem que o bebê nem tenha sido gerado? É isso?
caio_ferreira
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
rmendes08
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.
N
nilo_sj
bezier curve:
Ou seja, acessar uma variável da classe interna a partir da externa sem ter que instanciar a interna?
Você quer pegar uma perna do bebê sem que o bebê nem tenha sido gerado? É isso?
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.
rmendes08
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.
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.
publicstaticvoidmain(Stringargs[]){Testea=newTeste();Objectb=a.metodo();b.verAlgo()// aqui na consigo acessar os metodos da ClasseInternaMetodoClasseInternaMetodoc=(ClasseInternaMetodo)b;//isso também não funciona}
rmendes08
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.