Quando os campos estáticos são inicializados? Se eu nunca instanciar uma classe, mas acessar um campo estático, TODOS os blocos estáticos e métodos estáticos privados usados para instanciar campos estáticos privados são chamados (em ordem) naquele instante?
E se eu chamar um método estático? Ele também executa todos os blocos estáticos? Antes do método?
java
static
initialization
Tony R
fonte
fonte
Respostas:
A inicialização estática de uma classe normalmente acontece imediatamente antes da primeira vez que um dos seguintes eventos ocorre:
para uma classe de nível superior, uma instrução assert aninhada lexicamente na classe é executada1 .Consulte JLS 12.4.1 .
Também é possível forçar a inicialização de uma classe (se ainda não tiver inicializado) usando
Class.forName(fqn, true, classLoader)
ou a forma abreviadaClass.forName(fqn)
1 - O ponto final estava presente no JLS para Java 6 até Java 8, mas aparentemente foi um erro na especificação. Finalmente foi corrigido no Java 9 JLS: veja o código-fonte .
fonte
String
es são substituídos e não referenciados. Se você fizer referência a umclass Other { public static final int VAL = 10; }
de alguma classeMyClass { private int = Other.VAL; }
, a classeOther
não será carregada. Em vez disso, o compilador simplesmente substituirá o campo final no momento da compilação.String
variáveis 'finais estáticas' , apenas aquelas inicializadas por uma expressão constante.static
enquanto isso for um caso comum.Os campos estáticos são inicializados durante a inicialização "fase" de do carregamento da classe (carregamento, vinculação e inicialização) que inclui inicializadores estáticos e inicializações de seus campos estáticos. Os inicializadores estáticos são executados em uma ordem textual conforme definido na classe.
Considere o exemplo:
O Test.b é impresso
null
porque, quando osayHello
foi chamado no escopo estático, a variável estáticaa
não foi inicializada.fonte
Sim, todos os inicializadores estáticos são executados antes de você acessar a classe pela primeira vez. Se fosse de outra forma, eu chamaria de bug.
fonte