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.
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.
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:
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.
publicclassMensagem{privatestaticStringmsg;publicstaticconfiguraMsg(Stringmensagem){msg=mensagem;}publicvoidmostraMensagem(){System.out.println(msg);}publicStringgetMensagem(){returnmsg;}}//classe mainpublicclassTeste{publicstaticvoidmain(String[]args){//crie uma instância automaticamente da clásse static Mensagem e recupere o valor da variável msgStringmsgTeste=Mensagem.getMensagem();//utilize aquela instância já criada de Mensagem e imprima o valor de sua variávelMensagem.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
E quanto ao termo certo do ClassLoader, obrigado pela dica.
Acho que é isso, tópico resolvido. Muito obrigado pela colaboração de todos