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?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
Resultado:
inicializador estático chamado
inicializador de instância chamado
construtor chamado
inicializador de instância chamado
construtor chamado
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 escrever
int b;
b = 0;
Portanto, 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:
- O código do inicializador deve lidar com exceções
- Execute cálculos que não podem ser expressos com um inicializador de variável de instância.
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.
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/…