Uma seção no JLS pode ser encontrada: §12.4.2 .
Procedimento de inicialização detalhado:
9. Em seguida, execute os inicializadores de variável de classe e inicializadores estáticos da classe ou os inicializadores de campo da interface, em ordem textual, como se fossem um único bloco, exceto que as variáveis de classe finais e os campos de interfaces cujos valores são compilados - as constantes de tempo são inicializadas primeiro
Portanto, as três variáveis estáticas serão inicializadas uma a uma na ordem textual.
assim
static A obj = new A();
//num1 = 1, num2 = 1;
static int num1;
//this is initilized first, see below.
static int num2=0;
//num1 = 1, num2 = 0;
Se eu mudar o pedido para:
static int num1;
static int num2=0;
static A obj = new A();
O resultado será 1,1
.
Observe que o static int num1;
não é um inicializador de variável porque ( §8.3.2 ):
Se um declarador de campo contém um inicializador de variável, então ele tem a semântica de uma atribuição (§15.26) para a variável declarada e: Se o declarador é para uma variável de classe (ou seja, um campo estático), então o inicializador de variável é avaliada e a atribuição realizada exatamente uma vez, quando a classe é inicializada
E essa variável de classe é inicializada quando a classe é criada. Isso acontece primeiro ( §4.12.5 ).
Cada variável em um programa deve ter um valor antes de seu valor ser usado: Cada variável de classe, variável de instância ou componente de matriz é inicializado com um valor padrão quando é criado (§15.9, §15.10): Para o tipo byte, o valor padrão é zero, ou seja, o valor de (byte) 0. Para o tipo short, o valor padrão é zero, ou seja, o valor de (short) 0. Para o tipo int, o valor padrão é zero, ou seja, 0. Para o tipo long, o valor padrão é zero, ou seja, 0L. Para o tipo float, o valor padrão é zero positivo, ou seja, 0,0f. Para o tipo double, o valor padrão é zero positivo, ou seja, 0,0d. Para o tipo char, o valor padrão é o caractere nulo, ou seja, '\ u0000'. Para o tipo booleano, o valor padrão é falso. Para todos os tipos de referência (§4.3), o valor padrão é nulo.