class Bird {
{System.out.println("b1");}
public Bird() {
System.out.println("b2");
}
}
class Raptor extends Bird{
static {System.out.println("r1");}
public Raptor() {
super();
System.out.println("r2");
}
{ System.out.println("r3");}
static {System.out.println("r4");}
}
public class Hawk extends Raptor {
public static void main(String[] args) {
System.out.println("pre");
new Hawk();
System.out.println("hawk");
}
}
No caso, quando eu rodo o método main, o objeto da classe Hawk só seria instanciado na linha 3 não ?? Oque vocês acham que seria impresso ao rodar esse código ??
rapaz , minha dúvida é a seguinte : o pre não seria impresso antes do r1 e r4 ?? eu estava imaginando que o r1 e r4 só imprimiriam quando o objeto Hawk fosse instanciado(26 linha), pois é nessa hora que os contrutores das classes pai de hawk e seus blocos inicializadores e estáticos seriam chamados.
Os blocos estáticos tem comportamento diferente daqueles que não são estáticos. Eles são chamados quando a sua aplicação precisa da classe a que eles pertencem. Ou seja, quando o classloader carregar a classe na memória, a jvm já executará cada bloco estático daquela classe. Pra rodar o método main, o classloader terá que carregar a classe Hawk na memória certo? Mas perceba que Hawk extends Raptor, logo Raptor (assim como Bird, pois Raptor extends Bird) também será carregada em memória antes mesmo de o método main ser executado.
Um objeto do tipo Beta é um objeto do tipo Alpha, ou seja, Para cada objeto x, se x é Beta, então x é Alpha.(não se aplica no sentido contrário, um objeto Alpha pode ou não ser beta)
Então temos o objeto x, que é do tipo Beta logo, também Alpha.
E uma variável b, que é do mesmo tipo que x.
O código que você colocou é equivalente a:
Beta x = new Beta();
Alpha temp = (Alpha) x; // Ou simplesmente Alpha temp = x;
Beta b = (Beta) temp;