2012-03-07 3 views
-2

Я все еще участвую в ядре Java. Я хочу понять здесь понятия полиморфизма.Перегрузка Java-метода

Я понял переопределение и задал вопрос о перегрузке.

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

Я просто чувствую, что это довольно просто, как вызов различные методы, которые связываются во время компиляции, и только разница здесь в том, что у меня есть такое же имя метода ..

Class A { 

    method A(int i){} 

    method A(int i, int B){} 

} 

Пожалуйста, поделитесь своими входами.

Thks Punith

+2

В чем вопрос? –

+1

http://en.wikipedia.org/wiki/Function_overloading –

+1

Вам нужно задать более точный вопрос - на данный момент он не отвечает. –

ответ

6

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

public int Sum(int a, int b) { 
    return a + b; 
} 

public double Sum (double a, double b) { 
    return a + b; 
} 

В противном случае вы бы такие методы, как SumInt (...) и SumDouble (...) и так далее. Вы также можете иметь 2 методы с тем же типом возвращаемого значения, но другой вход и по-прежнему использовать перегрузки для удобства:

public int Sum(int a, int b) { 
    return Sum(a, b, 0); 
} 

public int Sum (int a, int b, int c) { 
    return a + b + c; 
} 

Таким образом, у вас есть только один место с Аль логика и все другие методы просто позвонить один метод со всей логикой, только с разными параметрами. И тогда есть также перегрузка конструктора. Например, вы можете иметь пустой конструктор, в котором вы установили некоторые значения по умолчанию, и вы можете иметь конструктор, где можно задать значения самостоятельно:

//Without overloading you'll have to set the properties after instantiating the class 
public MyClass() { 
    this.PropertyOne = "1"; 
    this.PropertyTwo = 2; 
} 

//usage: 
MyClass instance = new MyClass(); 
//now theproperties are already set to "1" and 2, wheter you like it or not 
//here you change the values 
instance.PropertyOne = "..."; 
instance.PropertyTwo = 0; 

//With constructor overloading you have this 
public MyClass() { 
    this("One", 2); 
} 

public MyClass(string propOne, int propTwo) { 
    this.PropertyOne = propOne; 
    this.PropertyTwo = propTwo; 
} 

//usage: 
MyClass instance = new MyClass("MyValue", 1000); 
//if you call MyClass() the default values STILL will be set :) 

Второй способ дает вам больше возможностей, не? И это упрощает изменение кода. Надеюсь это поможет!

0

ОК я не знаю, что вы точно хотите знать ...
полиморфизма: -
первой вещь: - Полиморфизм является использование для снижения сложности программиста. подумайте, что произойдет, если println() не был перегружен, и вам нужно запомнить другую функцию для печати другого типа.
2-я вещь: - В случае, когда полиморфизм времени компиляции java не поддерживается, в java все функции неявно виртуальны. его также достигают во время выполнения.
3st вещь: - через перегрузку функции имеют такое же имя, имеющие различный прототип, прототип =
имя, тип возврата и аргумент. в java с возвратом типа u не достигают перегрузки, имя должно быть одинаковым, поэтому единственное, что аргумент u может изменить для достижения перегрузки ..

+0

Перегрузка метода - это форма полиморфизма, которая разрешает время компиляции: http://en.wikipedia.org/wiki/Ad-hoc_polymorphism –

1

Обратите внимание, что в то время как метод перегрузка полезна в тех случаях, когда методы делают то же самое за кулисами, она может стать адом, если это не так:

someObject.setValue(obj.getTime()); // getTime returns a java.util.Date 

После некоторого рефакторинга (дата меняется на длинная временная метка ...):

someObject.setValue(obj.getTime()); // getTime now returns a long 

В новом коде setValue не может вести себя, как и предыдущую, если долго не обрабатываются как java.util.Date за кулисами.

Компилятор не будет показывать никаких ошибок, поскольку другой метод с тем же именем беззвучно захватит ваш новый тип, и программа будет прервана!

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

-1

Метод определения Перегрузки может состоять с тремя точками:
1. То же имя метода
2. Различные список аргументов
3. Изменяя порядок параметров.

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

Class Rectangle 
{ 
int length,breadth; 
//Default Constructor 
Rectangle() 
{ 
length=0; 
breadth=0; 
} 
//Parameterized Constructor 
Rectangle(int x,int y) 
{ 
length=x; 
breadth=y; 
} 
int area() 
{ 
int a; 
a=length * breadth; 
    return(a); 
System.out.println("Area of rectangle is:"+a); 
} 
Class calarea 
{ 
public static void main(string args[]) 
    { 
Rectangle rect1= new Rectangle(); 
Rectangle rect2= new Rectangle(10,15); 
rect1.area(); 
rect2.area(); 
} 
} 

В этой программе мы можем видеть, что тот же самый метод " Reactangle "используется с двумя разными списками параметров, поэтому просто мы можем сказать, что метод конструктора перегружен ... Сначала имя метода будет согласовано после этого, оно будет соответствовать количеству и типу параметров, и в соответствии с этим вызовом функция.

Метод Перегрузка не может быть достигнута с двумя точками:
1) Изменяя тип возвращаемого
2) путем изменения только имя параметра

0

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

Вы думаете, что разработчик, который разработал класс, поэтому вы говорите, что каждый раз в зависимости от аргументов вызывается другой метод (их тип и/или номер).

Подумайте, как разработчик, который будет использовать этот класс. Для него кажется, что он использует только один метод, который может обслуживать все типы аргументов, которые он хочет передать. (Хотя разные методы вызывают, но для внешнего мира он «НАПРАВЛЯЕТ», как будто существует только один метод).

Надеюсь, это поможет :)