SCJP 6.0 e questão sobre construtores

8 respostas
C

Mais uma pessoal. Na parte de construtores tive a seguinte dúvida. Ae vai o exercício:

class Building {
    Building() { System.out.print("b "); }
    Building(String name) {
    this(); 
    System.out.print("bn " + name);
    }
  }
  public class House extends Building {
  House() { System.out.print("h "); }
  House(String name) {
  this(); 
  System.out.print("hn " + name);
  }
public static void main(String[] args) { new House("x "); }
}

What is the result?
A. h hn x
B. hn x h
C. b h hn x
D. b hn x h
E. bn x h hn x
F. b bn x h hn x
G. bn x b h hn x
H. Compilation fails

Segue que a letra C está correta.
Isso seria impresso na console. Pelo que havia lido, um construtor na subclasse vai chamando o outro até o momento em que chama o construtor de Object. Indo pela ordem imaginei que o que aconteceria seria o seguinte:
New House("x ") iria chamar o construtor House(String name) e este por sua vez chamaria this(); o que levaria a Building() já que não houve argumento na chamada a this(). Então deveria imprimir primeiro b, por sua vez hn e depois x sendo b hn x. Pergunta: Porque o h seria impresso senão houve chamada ao construtor House() -sem argumentos- que seria o único que permitiria imprimir o h sozinho? Entendo que o processamento volta no caminho contrário desde a superclasse até a subclasse mas pelo resultado os dois construtores da subclasse House foram chamados na volta…
Tá certo esse resultado do livro?

8 Respostas

F

A resposta ta certa sim, isso por que no construtor House(String name) faz uma chamada a this(), que na verdade é construtor House(), entendeu?

D

Na verdade o this chamaria o construtor padrão da classe House, o que explica o "h " na saída.

“this()” é o responsável por chamar um construtor(nesse caso o padrão) da mesma classe
“super()” é o responsável por chamar um construtor(nesse caso também o padrão) da classe-pai

J

quado ele faz a chamada a this() ele chama o construtor de House() (Sem parametros). O construtor House(), implicitamente tem uma chamada a super(), aí sim ele chama o construtor Building().

Desculpe se não consegui ser claro.

Abs

hudsonpereira

Essa pergunta foi muito maligna… kkkk’

hudsonpereira

Um construtor filho invoca o construtor pai por padrão.

C

ah tá…bem explicado pessoal, agora faz mais sentido, valew mesmo pelas respostas… Tenho algumas dúvidas ainda, mas vamos fazer como Freddie Krueger, por partes.
Bom aproveitando, deixa eu mudar o código pra perguntar mais uma coisa

class Building {  
    Building() { System.out.print("b "); }  
    Building(String name) {  
    this();   
    System.out.print("bn " + name);  
    }  
  }  
  public class House extends Building {  
  
  House(String name) {  
  this();   //retiro this e substituo por super(String s) obrigatoriamente???
  System.out.print("hn " + name);  
  }  
public static void main(String[] args) { new House("x "); }  
}

Como podem ver eu retirei o construtor padrão da classe House, portanto obrigatoriamente eu deveria retirar o this(); do construtor House(String name), uma vez que no livro diz que podemos optar por não ter construtores default nas classes. Ele invocaria diretamente o construtor Building(String name) da superclasse ou dentro do construtor anterior da subclasse eu deveria fazer uma invocação através de super(String s);?

C

up…

D

O this() não funcionará mais retirando o construtor padrão, como você deve ter percebido. Porém, removendo o this() e deixando o método desse jeito ele vai rodar normalmente, sem adicionar nenhuma chamada para super(). Por que? Há um construtor sem argumentos na classe-pai(Building), então o compilador consegue inserir uma chamada a super() sem problemas. Caso você queira chamar o construtor que possui como parâmetro uma String, aí sim você terá que fazer a chamada super(“stringQualquer”).

Criado 12 de janeiro de 2011
Ultima resposta 17 de jan. de 2011
Respostas 8
Participantes 5