Qual é a diferença entre sobrecarregar um método e substituí-lo em Java?

10

Qual é a diferença entre sobrecarregar um método e substituí-lo em Java?

Existe uma diferença na assinatura do método, no especificador de acesso, no tipo de retorno etc.?

user63948
fonte
3
No PHP, sobrecarregar tem um significado completamente diferente .
Lortabac # /

Respostas:

41

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.

superM
fonte
@scarfridge, obrigado pela edição. Não tenho programação com Java há muito tempo e esqueci muito))))
superM
11
Obrigado por mencionar as anotações @Override e o fato de ter apenas tipos de retorno diferentes não fazer com que um método substitua, mas sobrecarregue.
Daniel Dinnyes
13

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.

NimChimpsky
fonte
11
por favor, não edite / expanda isso. A brevidade é o ponto.
NimChimpsky
7

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 nomeados draw, 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.

mosquito
fonte
2

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.

KeithS
fonte