Questão de Inicialização

15 respostas
sergiolpf

Ai galera blz???

Estava eu estudando pra minha bendita certificação quando veio essa questão, achei ela interessantíssima para que está estudando…

Gostaria que a galera que fosse certificada, ou q são os bichões num respondessem. O intuito é para que está se preparando =o)

vamos a questão:

as opções são:

mais tarde eu ponho a resposta.

Acho q seria interessante ter um post fixo só pra questões interessantes. =o)

Valeu.

15 Respostas

1112

Essa é do livro novo da Kathy Sierra, né?

sergiolpf

kkkk é sim. MAs num vale olhar =o)

1112

É, assim que eu olhei as alternativas eu lembrei. Já passei por esse capítulo, então eu deixo a pergunta pro pessoal.

T

Esse é o tipo de questão que testa se você dormiu direito à noite e se você tem paciência de simular as coisas no papel. Quem for resolvê-la, não se esquecer de:

  • Formatar direito o código para não se perder;
  • Riscar tudo que você sabe que vai lhe atrapalhar;
  • Pegar lápis e papel e seguir EXATAMENTE a seqüência de execução.
class Bird {
    {
        System.out.print("b1 ");
    }
    public Bird() {
        System.out.print("b2 ");
    }
}

class Raptor {
    static {
        System.out.print("r1 ");
    }
    public Raptor() {
        System.out.println("r2 ");
    }
    {
        System.out.print("r3 ");
    }
    static {
        System.out.print("r4 ");
    }
}

class Hawk extends Raptor {
    public static void main (String[] args) {
        System.out.print("pre ");
        new Hawk();
        System.out.println("hawk ");
    }
}
Deluxe

vo pesquisar x)

sakurai

Esse codigo está correto ??? Pelas respostas possiveis … acho que ta faltando alguma coisa.

I

bem…eu acho que do jeito que está…nenhuma das respostas seria correta…pois, eu acho, que a saida seria: r1 r4 pre r3 r2 hawk…
no entanto, se ficar class class Raptor extends Bird …ai sim a resposta seria a letra d

sergiolpf

foi malz galera, o meu primeiro era pra estar identado, eu tinha feito a identação =o)
E realmente está faltando coisa o correto é class Raptor extends Bird

mais uma vez, desculpem :smiley:

class Bird {
    { System.out.print("b1 "); }
    public Bird() { System.out.print("b2 "); }
}

class Raptor extends Bird{
    static { System.out.print("r1 "); }
    public Raptor() { System.out.println("r2 ");  }
    { System.out.print("r3 ");}
    static { System.out.print("r4 "); }
}

class Hawk extends Raptor {
    public static void main (String[] args) {
        System.out.print("pre ");
        new Hawk();
        System.out.println("hawk ");
    }
}
sergiolpf

thingol… a questão realmente só tem as identações de classes, não há identação nos blocos, como a kathy diz no livro dela: “O examinador irá colocar o maior número de linhas dentro de um espaço…” heheheh

T

É por isso mesmo que falei de “formatar o código para não se perder”. Como o pessoal lhe dá várias folhas de plástico duro e uma caneta de retroprojetor para fazer rascunhos, então tem bastante espaço para até formatar o código manualmente para não ser traído pelo código original.

Tipo clássico de questão que requer reformatação manual são aquelas com "if"s encadeados sem chaves. Se você não prestar atenção acaba achando que o código é uma coisa, quando na verdade é outra.

(É claro que com a prática você pode até dispensar isso, mas é igual a jogar xadrez sem tabuleiro. É possível - eu tinha dois colegas que faziam isso no colégio - mas não se deve brincar com isso em uma prova de certificação.)

H

Letra D . motivos " 1º ele executa os métodos estáticos antes mesmo de chamar qualquer outra coisa e só executa uma única vez." "Após ele executa os métodos entre chaves { } cada vez que for chamado o construtor e depois chama os métodos do construtor."
Então ficaria da seguinte forma .

> System.out.println(r1);

> System.out.println(r4);

Depois é feito o seguinte . Excecuta o main

>System.out.println(pre);

ao chamar o construtor de hawk ele chama o raptor que chama o bird , logo irá sair da seguinte forma :

> System.out.println(b1);

> System.out.println(b2);

> System.out.println(r2);

> System.out.println(r3);

> System.out.println(hawk);

então a resposta mais correta seria a letra “D”.

sergiolpf

hebertaquino:
Letra D . motivos " 1º ele executa os métodos estáticos antes mesmo de chamar qualquer outra coisa e só executa uma única vez." "Após ele executa os métodos entre chaves { } cada vez que for chamado o construtor e depois chama os métodos do construtor."
Então ficaria da seguinte forma .

Cara… entendi nada do que vc falou =o) heheheh
a sua resposta é a correta, mas o modo como vc explicou a execução foi confuso…

la vai.

Os blocos static são executados quando as classes são carregadas na JVM, logo são carregados uma única vez, tendo em vista que os membros statics fazem parte da classe e não do objeto. Depois quando criamos um objeto (new) o seu construtor faz uma chamada implicita/explicita a super(…). Após a execução do super os blocos de inicialização NÃO-ESTATICOS são executados e só depois disso é que o corpo dos contrutores são executados =o)
Então toda vez que um objeto é criado os blocos de inicialização não-estaticos são executados.

eu acho q ficou mais simples, mas se tiver ficado meio troncho por favor postem =o) valeu.

R


ao chamar o construtor de hawk ele chama o raptor que chama o bird

entendi legal,mas nessa parte fiquei a ver navios…

sergiolpf

raf4ever:

ao chamar o construtor de hawk ele chama o raptor que chama o bird

entendi legal,mas nessa parte fiquei a ver navios…

cara, é o seguinte…

a árvore de herança é a seguinte: Hawk -> Raptor -> Bird -> Object
ou seja, Hawk herda Haptor que herda Bird que herda Object certo???

Voltando aos contrutores temos que ou vc explicitamente põe um super ou um this, ou implicitamente o JVM põe um super() como primeira linha a ser executada no construtor… entao quando vc tem new Hawk() vc tem uma chamada a ou construtcto de Raptor que por sua vez chama o constructor de Bird que por sua vez chama o constructor de Object.

Ai depois de executar essa ruma de construtores o java vai executando os blocos de inicialização de tras pra frente, ou seja, os blocos de inicialização de Bird seguido pelo resto do construtor de Bird, depois os blocos de inicialização de Raptor, seguido pelo resto do corpo do contrutor de Raptor e por último os blocos de inicialização de Hawk seguindos pelo resto do corpo do construtor de Hawk…

ufa… é isso =o) e agora Raf4ever??? Entendeu? Espero q sim heheh

valeu.

R

Ahhh certo…

eh q eu tava olhando pelo primeiro código,onde :wink:

Criado 5 de maio de 2006
Ultima resposta 11 de mai. de 2006
Respostas 15
Participantes 8