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)???
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().
[quote=alexpfb]e se a superclasse tiver declarado o construtor como private?
eu acho que é a D a correta. mas não tenho certeza.
[/quote]
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]
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…
/**
* 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 há 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”.
[quote=thingol][quote]
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.
[/quote]
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 há 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”.
[/quote]
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)
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).