Membro static em uma classe interna comum

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.

Abraços

Edit:
@Visola explicou muito bem, obrigado!

[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.