Galéra estou com 2 dúvidas básicas. Bem básicas mesmo. Espero que vocês me ajudem.
Como de costume desde já agradeço.
A primeira ao que se refere herança, mais exatamente na parte de sobrescrição…
Qual a diferença entre sobrescrever e sobreposição, ou não existe nenhuma diferença?
A outra dúvida básica é no que se refere a construtores.
Tenho um construtor quero saber toda a resenha sobre Super() e This(), ou seja, é possível ter os 2 no mesmo contrutor e se puder qual a ordem que devem aparecer?
a) super tem de ser o primeiro comando no seu construtor.
b) A menos que você queira fazer um “loop infinito” (que na prática sai com “Stack Overflow”), não use “this” para acessar o próprio construtor, mas um outro. Por exemplo:
class A {
public A() {}
}
class B extends A {
public B () { this(); /* não faça isso porque vai entrar em loop */ }
public B () { this (5); /* isto está OK, vai chamar B (int x) */ }
public B (int x) { ... }
}
Sim…lembre-se o seguinte…em uma mesma classe quando escrevemos o mesmo método(assinatura igual) e alteramos a sua lista de parâmetros, estamos sobrepondo ou sobrecarregando.
Mas quando herdamos um método de uma classe e o reescrevemos na classe filha(não se pode alterar nem a assinatura e nem os parametros) estamos sobreescrevendo.
Obs. sobrecarga não exige herança, sobrescrita sim.
Sempre que vc sobrescrever um construtor deve utilizar a cláusula super em primeiro lugar.
Ex.
public Exemplo(String x, String y, String z){
super(x, y);
this.z = z;
}
neste caso as Strings x e y são os parâmetros da superclasse e a String z é uma particularidade da classe Exemplo.
Bem a minha dúvida sobre sobreposição e sobrecarga é a seguinte pra ser mais exato. Algumas questões falam de sobreposição e sobrecarga. Mas em algum momento elas também falam de sobrescrever.
Pensei que sobrescrever e sobrepor fossem a mesma coisa.
Ex: Um método sobrescreveu outro, ou então, um metodo sobrepos o outro.
Vou por um exemplo para ficar mais claro:
[code]public class MyClass{
public static void main(String[] agrs){
//algo…
}
void ametho(int i){
}
Alternativas:
A) protected void amethod(int i) throws Exception{}
B) public int amethod(int i) {return 0;}
C) void amethod(int i) throws RuntimeException{}
D) private int amethod (float i) {return 0;}
Explicação: Para uma sobrecarga válida, a lista de argumentos do método deve er diferente, o tipo de retorno pode ou não ser diferente. Portanto, a alternativa D é o modo válido de sobrecarga do metodo amethod da classe MyClass. O modificador de acesso não imprta em sobrecargas. A alternativa C é um modo válido de sobrescrever o método amethod, desde que o tipo de retorno e argumento sejam compativeis. O modificador de acesso é permitido de ser igual ou mais publico em sobreposições, portando isto também não é um problema. De qualquer forma, não é permitido lançar novas exceções checadas, lançar exceções não checadas é nenhum problema em sobreposições.
sobrescrever é quase sempre descrito como sobrescrita mesmo.(alterar o conteúdo de um método da superclasse na classe filha sem alterar sua assinatura ou parâmetros).
a confusão está no caso da sobreposição, que é a sobrecarga(criar 2 ou mais métodos com a mesma assinatura, porém lista de parâmetros diferentes dentro da mesma classe).
obs…eu fiz uma correção no meu post anterior…por favor releia.
Ok, agradeço a todos sobre a força que vcs me deram e tenho certeza que quando for postar meu resultado que se deus quizer vai ser positivo o Guj e todos vocês que colaboram vai estar na minha homenagem.
Tem outra, se esse construtor é sem parametro, o this vai ter que chamar um construtor com paramentos
public class A extends B{
A (){
this(1); // Não pode existir o super nesse bloco!
}
A (int x){
super(); // opcional + sempre vai existir
}
}
Se vc num colocar o super(), em tempo de compilação isso vai ser colocado!
Toda classe tem que ter um construtor chamando o construtor “Pai”! O que vc estender ou object