В чем разница между перегрузкой метода и его переопределением в Java?

10

В чем разница между перегрузкой метода и его переопределением в Java?

Есть ли разница в сигнатуре метода, спецификаторе доступа, типе возврата и т. Д.?

user63948
источник
3
В PHP перегрузка имеет совершенно другое значение .
Лортабак

Ответы:

41

Чтобы перегрузить метод новым методом, новый метод должен иметь другую подпись. Т.е. два перегруженных метода имеют одно и то же имя, но разные параметры. Вот пример двух перегруженных методов:

boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };

На основе типов параметров будет вызван соответствующий метод. Обратите внимание, что изменение типа возврата недостаточно (хотя вы можете сделать это дополнительно).

Когда метод переопределяется, новый метод имеет ту же сигнатуру и в некоторых случаях заменяет переопределенный метод. Вот пример переопределенного метода:

public class A 
{
     public void someMethod() { ... }
}

public class B extends A
{
     public void someMethod() { ... }
}

Выбор сделан на основе типа объекта. Например,

A someA = new B();
someA.someMethod();

будет называть someMethodиз B. Вы можете (и должны) добавить аннотацию @Override:

public class B extends A
{
     @Override
     public void someMethod() { ... }
}

Теперь, если вы случайно измените параметры в B, компилятор сообщит вам, что вы не переопределяете someMethod (), а перегружаете его.

superM
источник
@scarfridge, спасибо за редактирование. Давно не программировал на Java и много забыл)))
superM
1
Спасибо за упоминание аннотаций @Override и тот факт, что наличие только различных возвращаемых типов не приводит к переопределению метода, а к перегрузке.
Даниэль Динниес
13

Перегрузка, методы имеют одинаковое имя, но разные параметры.

Переопределение, реализация, данная в базовом классе, заменяется на реализацию в подклассе.

ним чимпский
источник
1
пожалуйста, не редактируйте / не расширяйте это. Краткость это точка.
НимЧимпский
7

Концепции, о которых вы спрашиваете, описаны в руководствах по Java.

Объяснение для переопределения дается следующим образом:

Метод экземпляра в подклассе с той же сигнатурой (имя, плюс номер и тип его параметров) и типом возврата, который используется в качестве метода экземпляра в суперклассе, переопределяет метод суперкласса.

Возможность подкласса переопределять метод позволяет классу наследовать от суперкласса, поведение которого «достаточно близко», а затем изменять поведение по мере необходимости. Метод переопределения имеет то же имя, число и тип параметров, и тип возвращаемого значения, что и метод, который он переопределяет. Переопределяющий метод также может возвращать подтип типа, возвращаемого переопределенным методом. Это называется ковариантным типом возврата .

При переопределении метода вы можете использовать @Overrideаннотацию, которая указывает компилятору, что вы намерены переопределить метод в суперклассе. Если по какой-то причине компилятор обнаружит, что метод не существует ни в одном из суперклассов, он выдаст ошибку. Для получения дополнительной информации @Overrideсм. Аннотации ...

Перегрузка объясняется в руководстве следующим образом:

Язык программирования Java поддерживает методы перегрузки, и Java может различать методы с разными сигнатурами методов. Это означает, что методы в классе могут иметь одно и то же имя, если они имеют разные списки параметров (есть некоторые уточнения к этому, которые будут обсуждаться в уроке под названием «Интерфейсы и наследование».

Предположим, что у вас есть класс, который может использовать каллиграфию для рисования различных типов данных (строки, целые числа и т. Д.) И который содержит метод для рисования каждого типа данных. Он громоздок использовать новое имя для каждого метода, например, drawString, drawInteger, drawFloatи так далее. В языке программирования Java вы можете использовать одно и то же имя для всех методов рисования, но передавать разные списки аргументов каждому методу. Таким образом, класс рисования данных может объявить четыре именованных метода draw, каждый из которых имеет свой список параметров ...

Перегруженные методы различаются по количеству и типу аргументов, передаваемых в метод ...

Вы не можете объявить более одного метода с тем же именем и тем же числом и типом аргументов, потому что компилятор не может их различить.

Компилятор не учитывает тип возвращаемого значения при различении методов, поэтому вы не можете объявить два метода с одинаковой сигнатурой, даже если они имеют другой тип возвращаемого значения.


Примечание. Перегруженные методы следует использовать с осторожностью, поскольку они могут сделать код гораздо менее читабельным.


В приведенном выше объяснении перегрузки упоминаются квалификации, обсуждаемые в уроке под названием «Интерфейсы и наследование» :

В подклассе вы можете перегрузить методы, унаследованные от суперкласса. Такие перегруженные методы не скрывают и не переопределяют методы суперкласса - они являются новыми методами, уникальными для подкласса.

комар
источник
2

Перегрузка метода обычно определяется как «предоставление нескольких доступных методов с одинаковыми именами, различающимися по количеству и типу входов и выходов». Концепция обычно заключается в том, что вы хотите иметь возможность выполнять одну и ту же базовую операцию с учетом различных наборов входных данных: например, вы можете «добавить» любые два значения числового типа, однако обычно важно знать, какой именно тип значение таково, что вы можете использовать преимущества или планировать конкретные действия такого типа. Таким образом, вы должны определить метод для каждой комбинации числовых типов (и / или коллекций), которые вы хотите поддерживать. Все эти методы имеют одинаковые имена, но разные «подписи»; во время компиляции,

Переопределение метода обычно определяется как «обеспечение другой реализации в производном классе метода с определенной сигнатурой, определенной в базовом классе». Есть много причин переопределить метод; практически все они имеют общий факт, что у производного класса есть дополнительные знания о том, что должно быть сделано, что не может знать базовый класс. Существует два вида переопределения в большинстве ОО-языков; переопределение может заменить метод базового класса или может расширитьметод базового класса. Различие состоит в том, что производный класс, который расширяет реализацию базового класса, будет вызывать переопределенную версию метода базового класса в некоторый момент во время выполнения переопределяющего метода. Это позволяет переопределяющим классам «повторно использовать» общие области операции, которые содержатся в базовом классе.

Keiths
источник