Estou olhando o código abaixo e encontrei algo um pouco estranho:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
Eu esperava que isso gerasse um erro de compilação, já que System.out
com "y" não pertence a uma declaração de método, apenas a { }
. Por que isso é válido? Não vejo como esse código seria ou deveria ser chamado.
Ao executar isso, ele x y c g
também produz , por que o static { }
get é chamado antes do construtor de sequência?
fonte
the code is copied into the beginning of each constructor of the class
- isso está incorreto. Digamos que o construtor comece comsuper("x ");
, o superconstrutor será executado antes de qualquer bloco de inicialização.Não é um método, mas um bloco de inicialização .
Ele será executado antes da chamada do construtor. Enquanto
é um bloco de inicialização estática que é executado quando a classe é carregada pelo carregador de classes.
Portanto, quando você executa seu código
1. A classe é carregada pelo carregador de classes para que o bloco de inicialização estático seja executado
Saída: x é impresso
2. O objeto é criado para que o bloco de inicialização seja executado e o construtor é chamado de
Saída: y é impresso seguido por c
3. O método principal é invocado, o que por sua vez invoca o método go
Saída: g é impresso
Resultado final: xycg
Isso pode ajudar http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
fonte
Esse é um bloco de inicialização de instância seguido por um bloco de inicialização estático .
é chamado quando você cria uma instância da classe.
é chamado quando a classe é carregada pelo carregador de classes. Então, quando você faz
a classe é carregada, então ela executa
static {}
, então ela executa o bloco de inicialização da instância{}
, depois o corpo do construtor é chamado e então o método na instância recém-criada. Portanto, a saídax y c g
.fonte
É um bloco estático e é chamado durante o carregamento da classe
É um bloco de inicialização
Você pode ter vários blocos de inicialização em uma classe, caso em que eles são executados na sequência em que aparecem na classe.
Observe que qualquer bloco de inicialização presente na classe é executado antes do construtor.
fonte
é um bloco de inicialização compartilhado pela classe (conforme indicado por
static
), que é executado primeiro.é um bloco de inicialização compartilhado por todos os objetos (construtores) da classe, que vem a seguir.
é um construtor específico para a classe, que é executado em terceiro lugar. O bloco de inicialização da instância é invocado primeiro sempre que o construtor é executado. É por isso que "y" vem logo antes de "c".
é apenas um método de instância associado a objetos construídos usando o construtor acima, que vem por último.
fonte
Esses tipos de blocos são chamados
initializer block
. Ele é executado sempre que você cria uma instância de aclass
. Em tempo de compilação, esse código é movido para cada construtor de sua classe.Onde, como no caso de
static initializer
bloco: -ele é executado uma vez quando a classe é carregada. Geralmente usamos o
static
bloco inicializador quando a inicialização de umstatic
campo requer várias etapas.fonte
É usado como um bloco de inicialização e é executado após qualquer declaração estática . Ele pode ser usado para garantir que ninguém mais possa criar uma instância da classe (da mesma forma que você usaria um construtor privado) como com o padrão de design Singleton .
fonte
Static blocks
são executados apenas uma vez quando a classe é carregada e inicializada pelo JRE.E o
non-static
bloco será chamado toda vez que você estiver criando uma nova instância e será chamado antes do Construtor.Como aqui, você criou apenas 1 instância de
Sequence
assim construída foi chamada após osnon-static
blocos e, em seguida, o método que realmente é seu objetivo.fonte