Respostas:
Para sobrecarregar um método com um novo método, o novo método deve ter uma assinatura diferente. Ou seja, dois métodos sobrecarregados têm o mesmo nome, mas parâmetros diferentes. Aqui está um exemplo de dois métodos sobrecarregados:
boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };
Com base nos tipos de parâmetro, o método correspondente será chamado. Observe que alterar o tipo de retorno não é suficiente (embora você possa fazer isso adicionalmente).
Quando um método é substituído, o novo método tem a mesma assinatura e, em alguns casos, substitui o método substituído. Aqui está um exemplo de um método substituído:
public class A
{
public void someMethod() { ... }
}
public class B extends A
{
public void someMethod() { ... }
}
A escolha é feita com base no tipo de objeto. Por exemplo,
A someA = new B();
someA.someMethod();
chamará o someMethodde B. Você pode (e deve) adicionar a anotação @Override:
public class B extends A
{
@Override
public void someMethod() { ... }
}
Agora, se você acidentalmente alterar os parâmetros em B, o compilador informará que você não está substituindo someMethod (), mas sobrecarregando-o.
Sobrecarregando, os métodos têm o mesmo nome, mas parâmetros diferentes.
Substituindo, a implementação dada na classe base é substituída pela da subclasse.
Os conceitos sobre os quais você pergunta são abordados nos tutoriais de Java.
A explicação para a substituição é fornecida da seguinte maneira:
Um método de instância em uma subclasse com a mesma assinatura (nome, mais o número e o tipo de seus parâmetros) e o tipo de retorno como um método de instância na superclasse substitui o método da superclasse.
A capacidade de uma subclasse de substituir um método permite que uma classe herde de uma superclasse cujo comportamento é "suficientemente próximo" e modifique o comportamento conforme necessário. O método de substituição tem o mesmo nome, número e tipo de parâmetros e tipo de retorno que o método que substitui. Um método de substituição também pode retornar um subtipo do tipo retornado pelo método substituído. Isso é chamado de tipo de retorno covariante .
Ao substituir um método, convém usar a
@Overrideanotação que instrui o compilador que você deseja substituir um método na superclasse. Se, por algum motivo, o compilador detectar que o método não existe em uma das superclasses, ele gerará um erro. Para mais informações@Override, consulte Anotações ...
A sobrecarga é explicada no tutorial da seguinte maneira:
A linguagem de programação Java suporta métodos de sobrecarga, e o Java pode distinguir entre métodos com diferentes assinaturas. Isso significa que os métodos dentro de uma classe podem ter o mesmo nome se tiverem listas de parâmetros diferentes (existem algumas qualificações para isso que serão discutidas na lição intitulada "Interfaces e herança".
Suponha que você tenha uma classe que possa usar caligrafia para desenhar vários tipos de dados (cadeias de caracteres, números inteiros etc.) e que contenha um método para desenhar cada tipo de dados. É complicado de usar um novo nome para cada método, por exemplo,
drawString,drawInteger,drawFloat, e assim por diante. Na linguagem de programação Java, você pode usar o mesmo nome para todos os métodos de desenho, mas passar uma lista de argumentos diferente para cada método. Assim, a classe de desenho de dados pode declarar quatro métodos nomeadosdraw, cada um com uma lista de parâmetros diferente ...Os métodos sobrecarregados são diferenciados pelo número e pelo tipo dos argumentos passados para o método ...
Você não pode declarar mais de um método com o mesmo nome e o mesmo número e tipo de argumentos, porque o compilador não pode diferenciá-los.
O compilador não considera o tipo de retorno ao diferenciar métodos, portanto, você não pode declarar dois métodos com a mesma assinatura, mesmo que eles tenham um tipo de retorno diferente.
Nota: Os métodos sobrecarregados devem ser usados com moderação, pois podem tornar o código muito menos legível.
A explicação acima para sobrecarregar menciona as qualificações discutidas na lição intitulada "Interfaces e herança" :
Em uma subclasse, você pode sobrecarregar os métodos herdados da superclasse. Tais métodos sobrecarregados nem ocultam nem substituem os métodos da superclasse - eles são novos, exclusivos da subclasse.
A sobrecarga de um método é normalmente definida como "fornecendo vários métodos disponíveis com o mesmo nome, diferindo pelo número e tipo de entradas e saídas". Geralmente, o conceito é que você deseja executar a mesma operação básica, considerando diversos conjuntos de entradas: é possível, por exemplo, "adicionar" quaisquer dois valores do tipo numérico; no entanto, geralmente é importante saber qual o tipo exato de o valor é para que você possa tirar proveito ou planejar comportamentos específicos desse tipo. Como tal, você definiria um método para cada combinação de tipos numéricos (e / ou coleções) que deseja oferecer suporte. Todos esses métodos têm o mesmo nome, mas "assinaturas" diferentes; em tempo de compilação,
A substituição de um método é normalmente definida como "fornecendo uma implementação diferente em uma classe derivada de um método com uma assinatura específica definida na classe base". Há muitas razões para substituir um método; praticamente todos eles têm em comum o fato de que a classe derivada possui conhecimento adicional do que deve ser feito, o que não pode ser conhecido pela classe base. Existem dois tipos de substituição na maioria dos idiomas OO; a substituição pode substituir o método da classe base ou pode estendero método da classe base. A diferença geralmente é que uma classe derivada que está estendendo uma implementação de classe base chamará a versão substituída da classe base em algum momento durante a execução do método substituto. Isso permite que as classes substituintes "reutilizem" áreas comuns da operação que estão contidas na classe base.