Связь перегрузки и типа возвращаемого метода в Java?
Если существует два метода, они имеют разные параметры, и их типы возвращаемых данных различны. Вот так:
int test(int p) {
System.out.println("version one");
return p;
}
boolean test(boolean p, int q) {
System.out.println("version two");
return p;
}
Если возвращаемые типы одинаковы, то, конечно, это перегрузка. Но поскольку возвращаемые типы различны , можем ли мы все еще считать это перегрузкой?
4 ответа:
Рассмотрим следующие моменты для перегрузки:
1) Первое и важное правило для перегрузки метода в java-это изменение сигнатуры метода. Сигнатура метода состоит из числа аргументов, типа аргументов и порядка аргументов, если они имеют разные типы.
public class DemoClass { // Overloaded method public Integer sum(Integer a, Integer b) { return a + b; } // Overloading method public Integer sum(Float a, Integer b) { //Valid return null; } }
2) возвращаемый тип метода никогда не является частью сигнатуры метода, поэтому только изменение возвращаемого типа метода не приводит к перегрузке метода.
public class DemoClass { // Overloaded method public Integer sum(Integer a, Integer b) { return a + b; } // Overloading method public Float sum(Integer a, Integer b) { //Not valid; Compile time error return null; } }
3) брошенные исключения от методов также не учитываются при перегрузке метода. Таким образом, ваш перегруженный метод создает одно и то же исключение, другое исключение или он просто не создает никакого исключения; никакого эффекта на загрузку метода.
public class DemoClass { // Overloaded method public Integer sum(Integer a, Integer b) throws NullPointerException{ return a + b; } // Overloading method public Integer sum(Integer a, Integer b) throws Exception{ //Not valid; Compile time error return null; } }
Процитируем официальный учебник :
Язык программирования Java поддерживает методы перегрузки, и Java может различать методы с различными сигнатурами методов. Это означает, что методы внутри класса могут иметь одно и то же имя, если они имеют разные списки параметров (есть некоторые требования к этому, которые будут рассмотрены в уроке под названием "интерфейсы и наследование").Наличие другого типа возврата несущественно для перегрузка. На самом деле, это довольно часто встречается с методами, которые возвращают один из своих аргументов. Например.,
java.util.Math
имеет кучу перегруженных методовmax
. Amax
из двухint
s возвращает anint
, amax
из двухdouble
S возвращает adouble
и т. д.
Да, это тоже перегрузка. Поскольку только имя и список параметров считаются частью сигнатуры метода для целей перегрузки метода, оба ваших метода
test
являются перегрузками друг друга.Также могут быть полезны сценарии для перегрузки такого метода. Рассмотрим следующий пример:
class Sanitizer { public static String sanitize(String s) { ... } public static int sanitize(int s) { ... } public static double sanitize(double s) { ... } }
Программист, который использует
Sanitizer
, может писать такие вещи, какString s2 = Sanitizer.sanitize(s1); int num2 = Sanitizer.sanitize(num1);
И перегрузка делает код одинаковым для переменных разных типов.