Não concordo com a resposta

16 respostas
sergiolpf

Galera estou estudando pelo livro do Khalid Mughal (A Programmer’s Guide to Java Certification: A Comprehensive Primer, Second Edition) e na parte de this() e super() tem uma questão meio troncha, eu tô achando q tem duas questões.

Pra não influenciar a resposta eu vou por a pergunta e dizer a minha resposta e pq. Depois eu ponho a resposta correta…

Valeu

A minha resposta foi a letra (e) mas não está correto.

Eu coloquei essa resposta pq ao utilizar um super() como primeira linha de um construtor de uma subclasse ele sempre ira chamar o construtor default da classe pai, desde que ele exista. Essa não é a condição de se chamar o super() (sem argumentos)???

16 Respostas

rigolin

Eu marcaria (b).

Isso deve ser verdade… suponhamos que a super classe e a subclasse não possuem um construtor… quando a subclasse for instanciada o construtor da superclasse será chamado, implicitamente, por meio do método super().

A

e se a superclasse tiver declarado o construtor como private?

eu acho que é a D a correta. mas não tenho certeza.

grprado

alexpfb:
e se a superclasse tiver declarado o construtor como private?

eu acho que é a D a correta. mas não tenho certeza.

A questão do construtor private: se a classe A tem um unico construtor PRIVATE, você não vai conseguir nunca fazer uma subclasse B. Pode digitar isso:

public class A {
        private A() {   }
}

public class B extends A {

}

Não compila. Embora a classe A não seja declarada final, ela não poderá ser extendida pois só tem construtores privados, inacessiveis da subclasse.

Quanto a letra D, ela está incorreta. Tente usar super() depois de this() e o compilador não deixa. Tente usar this() e depois super() e o compilador também não deixa.

O motivo, salvo meu entendimento estar bem equivocado, é que todo construtor deve chamar o construtor da classe pai antes de qualquer qualquer coisa, explicita ou implicitamente.

Ao chamar o super() e depois o this() seu programa rodaria 2 vezes o construtor da superclasse , uma vez dentro do metodo atual e outra no do this(). Isso nao poderia acontecer, então uma classe como especificada na letra D não compila.

Pra mim a resposta certa é a letra B.

[edit]Para o criador do topic:
Se voce tirar a pergunta do code acredito que melhoraria um pouco a organização desse topic, que esta um pouco ruim para a leitura.
Obrigado.
[/edit]

jeancz

Não pode ser e, porque nem sempre a classe pai vai ter um contrutor visible para a subclasse. O construtor pode ter sido modificado e ocultado.

T

Deve ser a b). Vou mostrar por quê.

class SuperClasse {
    int x = 1;
    int y = 2;
}

class SubClasse {
    int z = 3;
}

a "b" diz que se nada estiver declarado, o construtor implícito da da SubClasse chama "super()" implicitamente.

C>javap -c -classpath . SuperClasse
Compiled from "TesteCertificacao.java"
class SuperClasse extends java.lang.Object{
int x;

int y;

SuperClasse();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   iconst_1
   6:   putfield        #2; //Field x:I
   9:   aload_0
   10:  iconst_2
   11:  putfield        #3; //Field y:I
   14:  return

}

O compilador gerou um construtor implícito, sem parâmetros, que seria aproximadamente assim em Java:

public SuperClasse () {
    super(); // chama o construtor da classe Object
    x = 1;
    y = 2;
}
C>javap -c -classpath . SubClasse
Compiled from "TesteCertificacao.java"
class SubClasse extends SuperClasse{
int z;

SubClasse();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method SuperClasse."<init>":()V
   4:   aload_0
   5:   iconst_3
   6:   putfield        #2; //Field z:I
   9:   return

}

O compilador gerou um construtor implícito, sem parâmetros, que seria aproximadamente assim em Java:

public SubClasse () {
    super(); // chama o construtor da classe SuperClasse
    z = 3;
}
rigolin

Quanta modéstia…

Muito obrigado pela explicação!

sergiolpf

essa é a resposta… eu fiquei em duvida entre a ‘E’ e a ‘B’ mas resolvi escolher a E porque achei q ela era mais verdadeira. Se nao houverem construtores default definidos e se não houver sobrecarga de construtores tanto na superclasse como na subclasse ele vai chamar implicitamente o super() mas se vc puser o super() na primeira linha do construtor ele vai chamar o construtor da superclasse. Eu sei q ele só funcionará se houver um construtor construtor default. Mas ele diz q sempre funciona, contanto que hava um construtor default na superclasse. Foi isso q eu num entendi. Pra mim isso é verdade…

T

Como de costume, vou mostrar um contra-exemplo:

/**
 * Note que esta classe NÃO TEM CONSTRUTOR DEFAULT.
 */
class SuperClasse {
    int x;
    /**
     * Este é o único construtor desta classe, e ele NÃO É DEFAULT.
     */
    public SuperClasse (int pX) {
        x = pX;
    }
}

/**
 */
class SubClasse extends SuperClasse {
    double y;
    /**
     * Este construtor tentará chamar "super()" e não conseguirá.
     */
    public SubClasse (double pY) {
        super(); // aqui  um erro de compilação.
        y = pY;
    }
}

Tente compilar o código acima e veja o erro de compilação, que contraria sua resposta “e”.

sergiolpf

thingol:

e. Calling super() as the first statement in the body of a constructor of a subclass will always work, since all superclasses have a default constructor.

Como de costume, vou mostrar um contra-exemplo:

/**
 * Note que esta classe NÃO TEM CONSTRUTOR DEFAULT.
 */
class SuperClasse {
    int x;
    /**
     * Este é o único construtor desta classe, e ele NÃO É DEFAULT.
     */
    public SuperClasse (int pX) {
        x = pX;
    }
}

/**
 */
class SubClasse extends SuperClasse {
    double y;
    /**
     * Este construtor tentará chamar "super()" e não conseguirá.
     */
    public SubClasse (double pY) {
        super(); // aqui  um erro de compilação.
        y = pY;
    }
}

Tente compilar o código acima e veja o erro de compilação, que contraria sua resposta “e”.

Thingol… acho q estamos num conflito de interpretação… eu não disse q a B estava errada. Na minha explicação eu disse q tinha ficado em fúvida entre a B e a E mas achava q a segunda seria a mais correta.

Repare q no item E ele diz que “since all superclasses have a default constructor.”

Pra mim isso significa que a chamada sempre vai funcionar desde que as superclasses tenham o construtor default. Eu vejo q ele amarra o funcionamento a existência do construtor default (implícito ou explícito)… num vou colocar um contra exemplo senao eu vou por um com os dois casos que eu estou falando. Uma chamada explícita a um super() e uma super classe com um construtor default implícito e um com construtor default explícito. =o)

Na verdade o intuito desse tópico foi mostrar como podemos criar conflitos com relação a mesma pergunta… bom, quer dizer, como EU criei confusao em uma pergunta heheheh

bom mas é isso. Se concordarem ou discordarem… postem =o)

valeu

agodinho

isso não é pegadinha não gente?

Na última frase da e eu entendi " …, uma vez que todas superclasses possuem um construtor default" - meu inglês é fraco okay?

Se a tradução estiver correta essa opção não rola pois nem toda superclasse tem construtor default (óbviamente posso escrever uma classe sem construtor default, estendê-la numa outra qq e nessa última tentar executar super() - que não vai funcar).

Eu vou na B tb.

Woody

J2Alex

since all superclasses have a default constructor = visto que TODAS as superclasses possuem um construtor DEFAULT.

O problema foi de interpretação do termo “Since”. Sendo assim, essa afirmação é falsa, como o thingol já demonstrou acima.

agodinho

e aí? qual é a resposta correta?

Tô achando que ele acabou se convencendo da respota do teste!!!

:slight_smile:

Woody

T

É a (b), mas em provas não caem umas questões tão cabeludas assim (pelo menos na prova do SCJP 5.0).

É só pra assustar.

sergiolpf

J2Alex:
sergiolpf:


Repare q no item E ele diz que “since all superclasses have a default constructor.”

since all superclasses have a default constructor = visto que TODAS as superclasses possuem um construtor DEFAULT.

O problema foi de interpretação do termo “Since”. Sendo assim, essa afirmação é falsa, como o thingol já demonstrou acima.

Valeu Alex… o problema foi interpretação mesmo huahuauhauhhua

Eu me convencí sim da resposta. Valeu galera.

J2Alex

thingol:
É a (b), mas em provas não caem umas questões tão cabeludas assim (pelo menos na prova do SCJP 5.0).

É só pra assustar.

Essa é uma questão cabeluda? Nooossa… acho que já estou preparado pra fazer a certificação então… :smiley:

sergiolpf

Talves ela seja cabeluda por ter causado uma confusão =oP

Criado 29 de março de 2006
Ultima resposta 1 de abr. de 2006
Respostas 16
Participantes 8