Membro static em uma classe interna comum

4 respostas
diegohsi

Por que não posso colocoar um membro static em uma classe interna comum?

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

As vezes eu posso estar esquecendo de uma regra básica para membros static, mas não me recordo.

4 Respostas

x111
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();
	}
}
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.

Lucas_Rinaldi

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!

diegohsi

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.


hmmm… Realmente a sua explicação faz todo o sentido.

Criado 11 de janeiro de 2011
Ultima resposta 11 de jan. de 2011
Respostas 4
Participantes 4