Minha pergunta é sobre um uso específico da palavra-chave estática. É possível usar a static
palavra-chave para cobrir um bloco de código dentro de uma classe que não pertence a nenhuma função. Por exemplo, o seguinte código compila:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Se você remover a static
palavra-chave, ela reclama porque a variável a
é final
. No entanto, é possível remover as palavras-chave final
e as duas e static
compilá-las.
É confuso para mim nos dois sentidos. Como devo ter uma seção de código que não pertence a nenhum método? Como é possível invocá-lo? Em geral, qual é o objetivo desse uso? Ou melhor, onde posso encontrar documentação sobre isso?
fonte
public static void staticMethod(){}
, se executarTestStatic.class.getMethod("staticMethod");
. O inicializador estático não será chamado. Mais informações aqui docs.oracle.com/javase/specs/jvms/se10/html/…Uff! o que é inicializador estático?
O inicializador estático é um
static {}
bloco de código dentro da classe java e é executado apenas uma vez antes que o construtor ou o método principal seja chamado.ESTÁ BEM! Me diga mais...
static { ... }
dentro de qualquer classe java. e executado pela máquina virtual quando a classe é chamada.return
instrução é suportada.this
ousuper
são suportados.Hmm, onde posso usá-lo?
Pode ser usado em qualquer lugar que você se sinta bem :) simples assim. Mas vejo na maioria das vezes que é usado ao fazer conexão com o banco de dados, API init, Log e etc.
Não basta latir! onde está o exemplo?
Resultado???
Espero que isto ajude!
fonte
afterPropertiesSet()
deInitializingBean
?O
static
bloco é um "inicializador estático".É invocado automaticamente quando a classe é carregada, e não há outra maneira de invocá-la (nem mesmo através do Reflection).
Pessoalmente, eu só o usei ao escrever o código JNI:
fonte
Method
instância, mas apenas invocado pela máquina virtual Java.Isto é diretamente de http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Ordem de Execução
Veja a classe a seguir, você sabe qual delas é executada primeiro?
Resultado:
2. Como o inicializador de instância Java funciona?
O inicializador de instância acima contém uma instrução println. Para entender como ele funciona, podemos tratá-lo como uma declaração de atribuição de variável, por exemplo
b = 0
,. Isso pode tornar mais óbvio o entendimento.Ao invés de
int b = 0
você poderia escreverPortanto, inicializadores de instância e inicializadores de variável de instância são praticamente os mesmos.
3. Quando os inicializadores de instância são úteis?
O uso de inicializadores de instância é raro, mas ainda pode ser uma alternativa útil para inicializadores de variável de instância se:
Obviamente, esse código pode ser escrito em construtores. Mas se uma classe tivesse vários construtores, você teria que repetir o código em cada construtor.
Com um inicializador de instância, você pode escrever o código apenas uma vez e ele será executado independentemente do construtor usado para criar o objeto. (Acho que esse é apenas um conceito e não é usado com frequência.)
Outro caso em que os inicializadores de instância são úteis são as classes internas anônimas, que não podem declarar nenhum construtor. (Este será um bom lugar para colocar uma função de registro?)
Graças a Derhein.
Observe também que as classes anônimas que implementam interfaces [1] não têm construtores. Portanto, são necessários inicializadores de instância para executar qualquer tipo de expressão no momento da construção.
fonte
"final" garante que uma variável deve ser inicializada antes do final do código do inicializador de objetos. Da mesma forma "estático final" garante que uma variável será inicializada no final do código de inicialização da classe. Omitir o "estático" do seu código de inicialização o transforma em código de inicialização do objeto; portanto, sua variável não satisfaz mais suas garantias.
fonte
Você não gravará código em um bloco estático que precise ser chamado em qualquer lugar do seu programa. Se o objetivo do código for invocado, você deverá colocá-lo em um método
Você pode escrever blocos inicializadores estáticos para inicializar variáveis estáticas quando a classe é carregada, mas esse código pode ser mais complexo.
Um bloco inicializador estático se parece com um método sem nome, sem argumentos e sem tipo de retorno. Como você nunca o chama, não precisa de um nome. O único momento em que é chamado é quando a máquina virtual carrega a classe.
fonte
quando um desenvolvedor usa um bloco inicializador, o Java Compiler copia o inicializador em cada construtor da classe atual.
Exemplo:
o seguinte código:
é equivalente a:
Espero que meu exemplo seja entendido pelos desenvolvedores.
fonte
O bloco de código estático pode ser usado para instanciar ou inicializar variáveis de classe (ao contrário de variáveis de objeto). Portanto, declarar estática "a" significa que é apenas um compartilhado por todos os objetos de Teste, e o bloco de código estático inicializa "a" apenas uma vez, quando a classe Test é carregada pela primeira vez, não importa quantos objetos de Teste sejam criados.
fonte