Não consigo entender o seguinte texto ... Isso significa que <clinit>
é para construtores vazios? Por que é importante ter duas versões diferentes?
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
2.9. Special Methods
No nível da máquina virtual Java, cada construtor (§2.12) aparece como um método de inicialização de instância que possui o nome especial
<init>
. Este nome é fornecido por um compilador. Como o nome<init>
não é um identificador válido, ele não pode ser usado diretamente em um programa escrito na linguagem de programação Java. Os métodos de inicialização de instância podem ser chamados apenas na máquina virtual Java pela instrução invokespecial e podem ser chamados apenas em instâncias de classe não inicializadas. Um método de inicialização de instância assume as permissões de acesso (§2.7.4) do construtor do qual foi derivado.Uma classe ou interface tem no máximo um método de inicialização de classe ou interface e é inicializada (§2.17.4) invocando esse método. O método de inicialização de uma classe ou interface é estático e não leva argumentos. Tem um nome especial
<clinit>
. Este nome é fornecido por um compilador. Como o nome<clinit>
não é um identificador válido, ele não pode ser usado diretamente em um programa escrito na linguagem de programação Java. Os métodos de inicialização de classe e interface são chamados implicitamente pela máquina virtual Java; eles nunca são chamados diretamente de qualquer instrução de máquina virtual Java, mas são chamados apenas indiretamente como parte do processo de inicialização da classe.
CL
significa?<init>
denota um construtor,<clinit>
denota um inicializador estático : "Blocos de inicialização estáticos" no Tutorial Java , inicializador estático em Java .fonte
A diferença entre
<init>
e<clinit>
é que<init>
é usado para métodos construtores que inicializam uma instância de objeto, enquanto<clinit>
é usado para inicializar o próprio objeto de classe. Por exemplo, a inicialização de quaisquerstatic
campos de nível de classe é feita<clinit>
quando a classe é carregada e inicializada.fonte
Apenas para adicionar Se você usar o método Class.forName, ele apenas inicializa a classe. Portanto, a partir desse método, ele faz uma chamada apenas para clinit e quando você usa newInstance no objeto retornado de forName, ele chama init para a inicialização da instância. Você pode usar o código abaixo para vê-lo na depuração.
Para testar, use
fonte