Por que não posso colocoar um membro static em uma classe interna comum?
[code]class ClasseStatic1 {
public static class Aninhada1 {
static String str = “Eu sou uma variavel static”;
public void metodoAninhado1() {
System.out.println(“Metodo da classe ainhada 1.”);
metodoStatic();
System.out.println("String estatica: " + str);
System.out.println("String estatica: " + ClasseInterna1.strClasseInterna); // Tentei de varias formas chamar esse membro mas não consegui
}
}
public class ClasseInterna1 { //Como a classe interna não esta em um metodo não precisamos instanciala dentro da propria classe para usar o metodo.
static String strClasseInterna = "Eu sou uma variavel static de classe interna";
public void metodoInterno1() {
System.out.println("Metodo da classe interna 1");
}
}
public static void metodoStatic() {
System.out.println("Eu sou um metodo static");
}
public void metodo() {
class classeInternaMetodo1 { //Lembre-se tambem dos modificadores de acesso pra metodos, apenas FINAL para variaveis e ABSTRACT para classes
//são permitidos
public void metodoClasseInternaMetodo() {
System.out.println("Metodo da classe interna de metodo 1");
}
}
classeInternaMetodo1 cim1 = new classeInternaMetodo1();
cim1.metodoClasseInternaMetodo(); //Lembre-se: para utilizarmos metodos de dentro de uma classe interna de metodo precisamos de instancia-las, pois
//se tratando de um método a classe so será criada quando o metodo for chamado para a pilha, e nada de adianta se
//não tivermos uma instancia dessa classe para poder usar seu metodo, ou ela seria uma classe interna inútil.
}
}[/code]
As vezes eu posso estar esquecendo de uma regra básica para membros static, mas não me recordo.
public class TesteMinhaClasse {
public static class Teste{
public static String valor = "classe teste";
public static void MetodoTeste(){
System.out.println(valor);
}
}
public static void main(String[] args) {
System.out.println(Teste.valor);
Teste.MetodoTeste();
}
}
Pelo que o erro de compilação diz tipos estáticos só podem existir:
dentro de classes “top level”
dentro de classes internas estáticas
Até onde eu consigo enxergar, é um problema de escopo. Pensa o seguinte, o escopo estático existe a partir do momento que a classe é carregada - e só é criado uma vez. Porém, se a classe interna não é estática, ela só existe dentro de uma instância da classe onde ela foi declarada. O que implica que ela não tem um contexto estático. A própria declaração da classe (que seria o contexto estático dela) só existe dentro de uma instância. Por isso o erro de compilação.
Amigo, talvez seja porque tu só pode referenciar uma classe interna com uma instancia da classe externa, e a classe externa não faz referencia a uma classe.
Mas seila eu procurei e não encontrei uma definição boa, também estou na dúvida aqui, se descobrir posta.
[quote=visola]Pelo que o erro de compilação diz tipos estáticos só podem existir:
dentro de classes “top level”
dentro de classes internas estáticas
Até onde eu consigo enxergar, é um problema de escopo. Pensa o seguinte, o escopo estático existe a partir do momento que a classe é carregada - e só é criado uma vez. Porém, se a classe interna não é estática, ela só existe dentro de uma instância da classe onde ela foi declarada. O que implica que ela não tem um contexto estático. A própria declaração da classe (que seria o contexto estático dela) só existe dentro de uma instância. Por isso o erro de compilação.[/quote]
hmmm… Realmente a sua explicação faz todo o sentido.