Duvidaa respeito de sobre carga e sobre escrita

Alguem poderia me da uma explicação rapida do que é sobre carga e sobre escrita.

Agradeço pela ajuda

Sobrecarga e sobrescrita estão relacionadas a reutilização de um nome na construção de vários métodos.
Existem duas formas de fazer isso em Java:
**reusando um nome com diferentes lista de parâmetros ou usando o mesmo nome com a mesma lista de parâmetros.
O primeiro caso é conhecido como sobrecarga (overloading). Podem existir vários métodos sobrecarregados numa mesma classe.
O segundo caso é conhecido como sobrescrita (overrinding) e os métodos devem aparecer em classes diferentes.

Sobrecarga é o reuso de um mesmo nome (em uma classe ou subclasse) para diferentes métodos.
Veja o exemplo:

  1. public void abcMetodo(String s){ }
  2. public void abcMetodo(int i, String s) { }
  3. public void abcMetodo(String s, int i) { }

Os métodos ilustrados no exemplo acima têm duas semelhanças: o nome e o valor de retorno. Porém suas listas de parâmetros são diferentes. Somente o tipo dos argumentos são considerados, não seus nomes.
Veja outro exemplo:

  1. public void abcMetodo(int j, String nome) {…}
  2. public void abcMetodo(int i, String outronome) {…}
    Os métodos possuem o mesmo nome e a mesma lista de parâmetros e por isso o código acima é ilegal.

Podemos sumarizar os pontos chaves da sobrecarga de métodos da seguinte forma:

  • Um método é identificado pela seguinte combinação:
    (a) qualificadores; (b) nome; © lista de parâmetros (tipo, ordem e quantidade);
  • Dois ou mais métodos na mesma classe (incluindo métodos da subclasse) com os mesmos nomes mas parâmetros diferentes são considerados “sobrecarregados” (overloaded).
  • Métodos com nomes sobrecarregados são independentes. Usar o mesmo nome é somente uma conveniência para o programador. Tipo de retorno, qualificadores, exceções e lista de parâmetros são livres. Essa mesma liberdade não existe para a sobrescrita de métodos.

Sobrescrita de Métodos
Quando uma classe é extendida, a subclasse herda todos os métodos “não-privados” da classe pai. Algumas vezes, é desejável modificar o comportamento de um desses métodos na nova classe. Para fazer isso basta reescrever o método da classe pai utilizando o mesmo nome e a mesma lista de parâmetros (com algumas restrições quanto ao tipo de retorno, uso de modificadores de acesso e utilização de exceções). Nesse caso dizemos que o método está sendo sobrescrito.
Por exemplo:
Na super classe ?Mamífero? existe um método chamado ?locomoção? onde este método define como os animais mamíferos se locomovem.
Na subclasse ?Primata? também existirá um método chamado ?locomoção? (mais específico do que o da super classe) que determina que os seres dessa espécie anda sobre duas patas.

:wink:

Resumindo:

** Podem existir vários métodos [color=“red”]sobrecarregados[/color] em uma mesma classe;
Porém um método pode ser [color=“blue”]sobrescrito[/color] no máximo uma vez em uma subclasse. Na verdade essa restrição decorre do fato de não poder existir dois método iguais (mesmo nome e mesma lista parâmetros) em uma mesma classe;
** Métodos [color=“red”]sobrecarregados[/color] devem ter argumentos diferentes. Métodos [color=“blue”]sobrescritos[/color] devem ter argumentos idênticos. Na verdade se a lista de parâmetros NÃO for idêntica a do método original, então não existe [color=“blue”]sobrescrita[/color] e sim [color=“red”]sobrecarga[/color];
** O tipo de retorno de um método [color=“red”]sobrecarregado[/color] pode ser escolhido livremente; o tipo de retorno de um método [color=“blue”]sobrescrito[/color] deve ser idêntico ao método original.
** A [color=“red”]sobrecarga[/color] de métodos permite a implementação de várias funcionalidades utilizando o mesmo nome.

Espero ter ajudado :wink:

:?:
Aproveitando o embalo, como eu faço para sobrescrever contrutores em classes herdadas ?

Para construtores o raciocínio é o mesmo. Se quiser chamar um construtor da superclasse use “super ( … )”
T+

[quote=“renatobach”]Para construtores o raciocínio é o mesmo. Se quiser chamar um construtor da superclasse use “super ( … )”
T+[/quote]

detalhe: não há sobrescrita de construtores pq contrutures não são herdados…

Oi neto!

Construtores podem ser sobrescritos e sobrecarregados sim.
Exemplo:

public class Exemplo extends Object {

  protected boolean opcao = false;

        public Exemplo () {   //construtor da classe Object sobrescrito
              opcao = true;
        }
        public Exemplo ( boolean opcao ) {  //construtor sobrecarregado
              this.opcao = opcao;
        }

}

[quote=“renatobach”]Oi neto!

Construtores podem ser sobrescritos e sobrecarregados sim.
Exemplo:

public class Exemplo extends Object {

  protected boolean opcao = false;

        public Exemplo () {   //construtor da classe Object sobrescrito
              opcao = true;
        }
        public Exemplo ( boolean opcao ) {  //construtor sobrecarregado
              this.opcao = opcao;
        }

}[/quote]

ótimo, mas vc não deveria ter chamado o método construtor da classe Object? e aaproveitando, qualseria a diferença entre chamar ou não o método contrutor de Object??

renato, no teu exemplo o contrutor não foi sobrescrito…

para ter certeza do q tou dizendo fui pesquisar, e eis o q diz no Java 2 Certification Training Guide de Jaime Jaworski, página 100:

“One important way in which constructors differ from methods is that they are not inherited. Each class must define its own constructors. However, if no constructor is defined for a class, the compiler will supply a default constructor. The default constructor will not have any arguments and will simply invoke the constructor of the class’s superclass to construct an object of the class.”

ou seja:

“um importante modo em que contrutores diferem de metódos é q eles não são herdados. Cada classe deve definir seus próprios contrutores. Contudo, se nenhum construtor for definido para a classe, o compilador irá criar um contrutor padrão. Este não terá nenhum argumento e simplismente erá invocar o construtor da superclasse para contruir um objeto da classe”.

e respondendo a pergunto do merlim, precisa sim chamar super() para invocar o método da super classe. quando estamo herdando Object, não tem diferença… mas daí eu ACHO q é pq o contrutor de Object não faz nada, mas se vc tivesse trabalachando com outra classe precisaria sim. Por exemplo uma classe MinhaString, para ter todos os construtores de java.lang.String, teria q ser implementado todos os novos contrutores de MinhaString, invocando super(), com os argumentos da superclasse, é claro…

espero ter esclarecido…

Eu fiz uns testes , e vi três coisas:

1- Se criarmos um construtor padrão ( NomeClasse() ) para nossa classe herdada, o construtor padrão da nossa classe será executado, e o da classe herdada tb, e a herdada da herdada tb, e assim por diante…

2 - Porém, se declararmos um construtor diferente do padrão, e diferente da classe herdada ( com um parâmetro qquer, por exemplo )
precisamos usar super() no construtor da classe herdada, senão dá erro.

Segue o código:

class Pai {
Pai(){
System.out.println(“Contrutor do pai.”);
}
}

class Filho extends Pai {
Filho(){
System.out.println(“Contrutor do filho.”);
} // se comentarmos este construtor dará erro tb.
Filho(String teste){
System.out.println("Contrutor do filho - "+teste);
}
}

public class Neto extends Filho {
Neto(){
super(“teste”); // se comentarmos dá erro
System.out.println(“Construtor do neto”);
}
public static void main(String[] arg){
Neto neto = new Neto();
System.out.println(“Fim.”);
}
}

:lol: Valeu !!

descobri o pq disso e tb a difenrença entre usar ou não usar o super, de novo no Java 2 Certification Training Guide.

“If neither this() nor super() is supplied, an implicit super() (with no arguments) is supplied by the compiler. This causes the superclass portion of an object to be created before that of the class itself.”

“Se nem this() nem super() for usado, um super() implícido (sem argumentos) será complementado pelo compilador. A causa disso é q a parte da superclasse do objeto sera criada antes própria class”

ainda no livro ele explica que se a super classe não tiver um construtor sem argumentos, vai dar erro, exatamento como vc provou na prática.

espero ter ajudado…

Caro neto:

pelo que percebi da sua conversa com o nosso colega, vocÊ está confundindo sobrecarga com polimorfismo.

Sobrecarga acontece quando se tem dois métodos com o mesmo nome, diferenciados pela assinatura.

O polimorfismo é uma prática da Orientação a Objetos muito utilizada e extremamente útil. A sua característica é de que um mesmo métodos aja de forma diferenciada dependendo do contexto em que ele é empregado. Isso é muito utilizado quando se trabalha com herança.

No caso dos construtores herdados que vc perguntou, o que ocorre quando se chama o super() é simplesmente a construção do pai, ou seja, o construtor da classe pai é executado.

Exemplos:

1 - Sobrecarga

public void metodo1() {};

public void metodo1(String argumento) {};

2 - polimorfismo

public class Teste {
public void metodo2() {
System.out.println(“Teste1”);
}
}

public class FilhaTeste1 extends Teste {
public void metodo2() {
System.out.println(“Teste2”);
}
}

public class FilhaTeste2 extends Teste {
public void metodo2() {
System.out.println(“Teste3”);
}
}

Notou que dependendo da classe instanciada o método responde de forma diferente???

é isso ae mon ami!!!

Cristóvão,

Entendo perfeitamente o q vc quer dizer. Mas só estou tentando convencê-los d que métodos podem ser sobrescritos (overriding) e/ou sobrecarregados (overloading), isso td mundo já sacou. Mas construtores não podem ser sobrescritos - só sobrecarregados. Quer dizer, aparentemente vc até pode ter um construtor de uma classe filha com a mesma assinatura do construtor da classe pai, mas apesar de parecer, não é sobrecarga.

É um conhecimento quase que inútil, mas se cai numa prova de certificação: “Contrutores NÃO são herdados”, está certo.

Concordam?

Neto,

tá certo, realmente, não existe polimorfismo no construtor, eles não são herdados. Muito bem acrescentado!!!