Porque a saida dele é: CFBAED?
O pouco que sei é que a classe Inicializacao herda da class SuperInicializacao e métodos e atributos estáticos só podem acessar outros métodos e atributos estáticos da mesma classe e que o metodo static só poder ser chamado atraves da classe.
Se o objeto instaciado in é da classe Inicializacao porque foi executado metodo static da classe SuperInicializacao: ?
Blocos de inicialização estáticos são chamados primeiro, assim que as classes são carregadas, logo após vêm os blocos de inicialização, depois o construtor das superclasses (classes pais) depois o construtor da classe!
a) Você chama o método main da classe Inicialização, que deve ser carregada
b) A classe Inicialização requer o carregamento da classe SuperInicialização
c) O carregamento da classe SuperInicialização força a execução do static block, fazendo que se imprima “C”
d) Como as classes de que depende a Inicialização foram carregadas, agora é a vez de acabar de carregar a classe Inicialização
e) O carregamento da classe Inicialização força a execução do static block, fazendo que se imprima “F”
f) Agora podemos chamar o construtor default da classe Inicialização.
g) O construtor default da classe Inicialização chama implicitamente o construtor default da classe SuperInicialização
h) O construtor default da classe SuperInicialização deve chamar o bloco anônimo ("{ System.out.println (“B”); }") antes de
executar o código escrito no próprio construtor. Isso imprime “B”
i) Agora sim o construtor default da classe SuperInicialização pode imprimir “A”.
j) Voltando ao processamento do construtor default da classe Inicialização, agora devemos chamar o bloco anônimo
("{ System.out.println (“E”); }") . Isso imprime “E”
k) Por fim, devemos executar o código escrito no próprio construtor default da classe Inicialização, que imprime “D”.
A
AlunoJava
Entao a classe Inicialização executou 1º o bloco estatico da classe SuperInicialização porque a classe Inicializacao herda da classe SuperInicializacao?
Se nao tivesse a herança da classe SuperInicializacao ele iria executar o bloco estatico da classe Inicializacao?É isso?
Entao existe um ordem de execucaçao dos metodos:
metodos estaticos
2)bloco anonimo
3)código escrito no próprio construtor default da classe Inicialização.
thiago.correa
Sim para as duas perguntas, mas reformulando a ordem de execução seria:
1º Blocos estáticos (começando a partir da super classe, se houver)
2º Blocos de inicialização (começando a partir da super classe, se houver)
3° Construtor (começando a partir da super classe, se houver, aqui entra o construtor que foi chamado, caso não seja chamado explicitamente um outro contrutor que não seja o default, caso contrário, será o construtor default que será executado)
Marky.Vasconcelos
Os blocos estaticos são carregados assim que voce carrega uma classe.
Exemplo
packagebr;publicclassA{static{System.out.println("classe A carregada");}publicstaticvoiddoNothing(){}}publicclassB{publicstaticvoidmain(String...args){Class.forName("br.A");//Isso causa o carregamento da classeA.doNothing();//Aqui também carregaria a classe caso não tivesse sido carregada com Class.forName}}