[RESOLVIDO] ~ Dúvida com método / classe static

10 respostas
juninhodg

Boa tarde! Bom, já li alguns artigos e tópicos daqui do fórum sobre a palavra chave static e entendi o que quiseram passar (eu acho hehe).

Acontece que eu estou lendo um livro que tem dentro de uma classe o seguinte trecho de código:

static {
[...]
}

Apenas a palavra chave static e o bloco de código com uma determinada funcionalidade. Então, queria entender essa estrutura, o que ela representa pra JVM?

Estou certo ao pensar que para recuperar um retorno de um método static eu não preciso de instanciar a classe?

Se isso for relevante, é um trecho ensinando a fazer a classe HibernateUtil.
Abraços.

10 Respostas

ErickRAR

O que está dentro do bloco static só é chamado uma vez. Se você fizer:

public class Teste {
    public Teste(){
  System.out.println("Construtor");
}
   static { 
   System.out.println("Bloco static");
   } 
}

e depois instanciar a classe 3 vezes, por exemplo, a saída será essa:

Teste teste = new Teste();
 Teste teste = new Teste();
 Teste teste = new Teste();


//saída do console
Construtor
Bloco static
Construtor
Construtor

ps: Na verdade, agora não lembro se o bloco static é chamado após o primeiro construtor. Faz tempo que não vejo isso, mas o ponto importante é que será chamado apenas uma vez.

Complentando, o que é static, é igual para todos da classe. Atributos/métodos staticos podem ser acessados sem a classe ter sido instanciada.

Se tivesse:

public class Teste {
   static String titulo= "GUJ";
   public static boolean validaAe(){
   //validacao
   return true;
}

//para acessar
  Teste.titulo
  Teste.validaAe();
Rodrigo_Sasaki

O bloco static é executado quando a classe é carregada pelo ClassLoader, antes de qualquer instância ser criada.

Aliás, é assim que aquele Class.forName para carregar o driver do JDBC (antes da versão 4) funcionava.

juninhodg

O que está no bloco static é carregado pelo ClassLoader, e esse ClassLoader, carrega a classe em questão a partir de que momento?

ErickRAR

O bloco static é executado quando a classe é carregada pelo ClassLoader, antes de qualquer instância ser criada.

Aliás, é assim que aquele Class.forName para carregar o driver do JDBC (antes da versão 4) funcionava.

Opa, valeu. Recordar é viver, viver é aprender…

Rodrigo_Sasaki

Quando ele precisar dessa classe. se você invocar Class.forName() por exemplo, ou criar uma nova instância de uma classe que ainda não foi carregada.

juninhodg

Então digamos que eu tenha uma classe static, e que um o método foo() que também é static executa uma determinada função e retorna String. Se eu pôr no código:

String str = ClasseStatic.foo();

…mesmo sem uma instância ele retorna esse valor?

juninhodg

Acho que já peguei, li e reli esse artigo denovo ~> http://www.guj.com.br/articles/121

Quando uma classe é static e você a requisita, faz com que o ClassLoader "instancie automaticamente" essa classe, e toda vez que você tentar acessar um método ou variável static através do nome da classe, ela vai apontar pra classe já instanciada "automaticamente" pelo ClassLoader.

public class Mensagem {
  private static String msg;

  public static configuraMsg(String mensagem) {
    msg = mensagem;
  }

  public void mostraMensagem() {
    System.out.println(msg);
  }

  public String getMensagem() {
    return msg;
  }
}

//classe main
public class Teste {
  public static void main(String[] args) {
    //crie uma instância automaticamente da clásse static Mensagem e recupere o valor da variável msg
    String msgTeste = Mensagem.getMensagem();

    //utilize aquela instância já criada de Mensagem e imprima o valor de sua variável
    Mensagem.mostraMensagem();
  }
  
}

Tá certo o jeito que eu tô pensando?

ErickRAR

mostraMensagem só funcionará se o objeto estiver instanciado. Acessar algo estático sem o objeto estiver instanciado, não cria instancia.

Rodrigo_Sasaki

Exato, é o que o ErickRAR falou.
E muito cuidado com os termos, o classloader não vai instanciar nada, ele só vai carregar a classe.

juninhodg

Oi pessoas. Foi erro de digitação no código, já havia entendido essa parte hehe :stuck_out_tongue:
E quanto ao termo certo do ClassLoader, obrigado pela dica.

Acho que é isso, tópico resolvido. Muito obrigado pela colaboração de todos :slight_smile:

Criado 30 de outubro de 2012
Ultima resposta 31 de out. de 2012
Respostas 10
Participantes 3