Static classes

6 respostas
P

Oi,

Se eu tiver a classe em baixo, porque razão a class MyObject tem que ser static? Porque não se pode considerar uma classe normal, mesmo que eu instancie uma dentro de uma class static? Se repararmos, por cada passgem pela classe static eu crio um objecto normal.

public class Class1() {
	public static class MapOutputServlet extends HttpServlet {
		private static final long serialVersionUID = 8959378560207291947L;


		@Override
		public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
                        MyObject mo = new MyObject();
                }

       private class MyObject { ... }
}

Obrigado

6 Respostas

emmanuelrock

E se fizer assim:

public class Class1 {   

        private class MapOutputServlet extends HttpServlet {   
            private static final long serialVersionUID = 8959378560207291947L;   
  
   
           @Override   
           public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException,         IOException {   
                        MyObject mo = new MyObject();   
           }   
  
         private class MyObject { ... }   
}
Eduardo_Bregaida

Depende do contexto no qual vc quer usar.
Exemplo: Se (no caso no método estático) eu quisesse saber quantas pessoas visitam meu site, se fosse com servlet.

se o método n fosse estático ele não compartilharia a mesma instancia da minha classe, sempre seria new dizendo que apenas 1 pessoa visitou meu site.
No caso se ele for static estou dizendo que ele compartilha a instancia da minha classe, ou seja, iria incrementar a cada pessoa que entra nesse método estático.

É a mesma idéia se você quer que a Classe interna compartilhe a instância da classe externa tem que ser static, caso contrário elas trabalharão de forma independente.

O primeiro código n compila por estar num contexto estático eu nao consigo referenciar elementos de contexto não-estático :smiley:

mapleplayer

Tenho a mesma dúvida.
Não sei por qual motivo não posso ter uma nested-class em uma static nested-class, uma vez que uma static nested-class se comporta como uma top-level class
Já procurei a resposta e não encontrei também.

Eduardo_Bregaida

Vejam também: http://www.caelum.com.br/download/caelum-java-objetos-fj11.pdf e http://javafree.uol.com.br/artigo/6954/Cap-8-Classes-internas.html :smiley:

discorpio

Bom dia a todos.

Uma das razões o nosso amigo Eduardo Bregaida já explicou.

O outra é que voce declarou a classe MyObject com o modificado “private”, ou seja, a classe MyObject é um membro privado de Class1 que é a classe externa.

Assim sendo, voce só poderá instanciar MyObject dentro de Class1, e mesmo que faça isto, somente Class1 terá acesso aos atributos ou métodos de MyObject, visto que a visibilidade está restrita a Class1, mesmo ela sendo static portanto, se voce pretende dar acesso a MyObject fora de Class1, então corrija o modificador para “public”.

Se voce declara a classe MyObject com o modificador “public”, vai poder instanciá-la fora de Class1, de dois modos:

// MyObject declarada como classe não estática
Class1 c1 = new Class1();
Class1.MyObject mobj = c1.new MyObject();

// MyObject declarada como classe estática
Class1.MyObject mobj = new Class1.MyObject();

Observações:
Tanto na classe interna estática quanto na classe interna não estática, voce só conseguirá acessar os membros da classe interna fora da classe externa, instanciando a mesma. A única diferença é que com a classe interna declarada como estática, voce não precisa instanciar a classe externa, eliminando um linha de código, eliminando também mais um objeto em memória, além do que já foi dito, os seus valores fazer referência a um único objeto.

H

Concordo com tudo, com exceção da última parte. Apesar de chamarem de classe interna estática, o que é estático é a definição. Se criar várias instancias de uma classe interna estática verá que cada uma possui suas variáveis.

Sds.

Criado 1 de março de 2011
Ultima resposta 18 de mai. de 2011
Respostas 6
Participantes 6