У Java перевантаження методів дозволяє різним методам мати однакові назви, але різні підписи, де підписи можуть відрізнятися кількістю вхідних параметрів або типом вхідних параметрів, або їх поєднанням.
Перевантаження методів у Java також відоме як Поліморфізм під час компіляції , статичний поліморфізм, або Рання зв'язка . У разі перевантаження методу порівняно з батьківським аргументом дочірній аргумент отримає найвищий пріоритет.
Приклад перевантаження методу
Java
// Java program to demonstrate working of method> // overloading in Java> > public> class> Sum {> > // Overloaded sum(). This sum takes two int parameters> > public> int> sum(> int> x,> int> y) {> return> (x + y); }> > > // Overloaded sum(). This sum takes three int parameters> > public> int> sum(> int> x,> int> y,> int> z)> > {> > return> (x + y + z);> > }> > > // Overloaded sum(). This sum takes two double> > // parameters> > public> double> sum(> double> x,> double> y)> > {> > return> (x + y);> > }> > > // Driver code> > public> static> void> main(String args[])> > {> > Sum s => new> Sum();> > System.out.println(s.sum(> 10> ,> 20> ));> > System.out.println(s.sum(> 10> ,> 20> ,> 30> ));> > System.out.println(s.sum(> 10.5> ,> 20.5> ));> > }> }> |
>
розбиття рядка c++
>Вихід
30 60 31.0>
Різні способи перевантаження методів у Java
- Зміна кількості параметрів.
- Зміна типів даних аргументів.
- Зміна порядку параметрів методів
1. Зміна кількості параметрів
Перевантаження методів можна досягти шляхом зміни кількості параметрів при переході до різних методів.
Нижче наведено реалізацію вищезазначеного методу:
Java
// Java Program to Illustrate Method Overloading> // By Changing the Number of Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Product {> > // Method 1> > // Multiplying two integer values> > public> int> multiply(> int> a,> int> b)> > {> > int> prod = a * b;> > return> prod;> > }> > > // Method 2> > // Multiplying three integer values> > public> int> multiply(> int> a,> int> b,> int> c)> > {> > int> prod = a * b * c;> > return> prod;> > }> }> > // Class 2> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String[] args)> > {> > // Creating object of above class inside main()> > // method> > Product ob => new> Product();> > > // Calling method to Multiply 2 numbers> > int> prod1 = ob.multiply(> 1> ,> 2> );> > > // Printing Product of 2 numbers> > System.out.println(> > 'Product of the two integer value :'> + prod1);> > > // Calling method to multiply 3 numbers> > int> prod2 = ob.multiply(> 1> ,> 2> ,> 3> );> > > // Printing product of 3 numbers> > System.out.println(> > 'Product of the three integer value :'> + prod2);> > }> }> |
>
>Вихід
Product of the two integer value :2 Product of the three integer value :6>
2. Зміна типів даних аргументів
У багатьох випадках методи можна вважати перевантаженими, якщо вони мають однакові назви, але різні типи параметрів, методи вважаються перевантаженими.
Нижче наведено реалізацію вищезазначеного методу:
Java
// Java Program to Illustrate Method Overloading> // By Changing Data Types of the Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Product {> > // Multiplying three integer values> > public> int> Prod(> int> a,> int> b,> int> c)> > {> > int> prod1 = a * b * c;> > return> prod1;> > }> > > // Multiplying three double values.> > public> double> Prod(> double> a,> double> b,> double> c)> > {> > double> prod2 = a * b * c;> > return> prod2;> > }> }> > class> GFG {> > public> static> void> main(String[] args)> > {> > Product obj => new> Product();> > > int> prod1 = obj.Prod(> 1> ,> 2> ,> 3> );> > System.out.println(> > 'Product of the three integer value :'> + prod1);> > > double> prod2 = obj.Prod(> 1.0> ,> 2.0> ,> 3.0> );> > System.out.println(> > 'Product of the three double value :'> + prod2);> > }> }> |
>
>Вихід
Product of the three integer value :6 Product of the three double value :6.0>
3. Зміна порядку параметрів методів
Перевантаження методів також може бути реалізовано шляхом зміни параметрів двох або більше перевантажених методів. Наприклад, якщо параметрами методу 1 є (String name, int roll_no), а іншого методу є (int roll_no, String name), але обидва мають однакові назви, тоді ці 2 методи вважаються перевантаженими різними послідовностями параметрів .
Нижче наведено реалізацію вищезазначеного методу:
Java
// Java Program to Illustrate Method Overloading> // By changing the Order of the Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Student {> > // Method 1> > public> void> StudentId(String name,> int> roll_no)> > {> > System.out.println(> 'Name :'> + name +> ' '> > +> 'Roll-No :'> + roll_no);> > }> > > // Method 2> > public> void> StudentId(> int> roll_no, String name)> > {> > // Again printing name and id of person> > System.out.println(> 'Roll-No :'> + roll_no +> ' '> > +> 'Name :'> + name);> > }> }> > // Class 2> // Main class> class> GFG {> > // Main function> > public> static> void> main(String[] args)> > {> > // Creating object of above class> > Student obj => new> Student();> > > // Passing name and id> > // Note: Reversing order> > obj.StudentId(> 'Spyd3r'> ,> 1> );> > obj.StudentId(> 2> ,> 'Kamlesh'> );> > }> }> |
>
>Вихід
Name :Spyd3r Roll-No :1 Roll-No :2 Name :Kamlesh>
Що робити, якщо точний прототип не збігається з аргументами?
З точки зору пріоритету, компілятор виконує такі дії:
- Перетворення типу, але до вищого типу (з точки зору діапазону) у тому самому сімействі.
- Перетворення типів до наступного вищого сімейства (припустімо, якщо немає довгого типу даних, доступного для типу даних int, тоді він шукатиме тип даних float).

Розглянемо приклад, щоб прояснити концепцію:
Java
// Demo Class> class> Demo {> > public> void> show(> int> x)> > {> > System.out.println(> 'In int'> + x);> > }> > public> void> show(String s)> > {> > System.out.println(> 'In String'> + s);> > }> > public> void> show(> byte> b)> > {> > System.out.println(> 'In byte'> + b);> > }> }> > class> UseDemo {> > public> static> void> main(String[] args)> > {> > byte> a => 25> ;> > Demo obj => new> Demo();> > > // it will go to> > // byte argument> > obj.show(a);> > > // String> > obj.show(> 'hello'> );> > > // Int> > obj.show(> 250> );> > > // Since char is> > // not available, so the datatype> > // higher than char in terms of> > // range is int.> > obj.show(> 'A'> );> > > // String> > obj.show(> 'A'> );> > > // since float datatype> > // is not available and so it's higher> > // datatype, so at this step their> > // will be an error.> > obj.show(> 7.5> );> > }> }> |
>
>
Вихід
./UseDemo.java:46: error: no suitable method found for show(double) obj.show(7.5); ^ method Demo.show(int) is not applicable (argument mismatch; possible lossy conversion from double to int) method Demo.show(String) is not applicable (argument mismatch; double cannot be converted to String) method Demo.show(byte) is not applicable (argument mismatch; possible lossy conversion from double to byte) 1 error>
Переваги перевантаження методів
- Перевантаження методів покращує читабельність і можливість повторного використання програми.
- Перевантаження методів зменшує складність програми.
- Використовуючи перевантаження методів, програмісти можуть ефективно та результативно виконувати завдання.
- Використовуючи перевантаження методів, можна отримати доступ до методів, які виконують пов’язані функції з дещо іншими аргументами та типами.
- Об'єкти класу також можна ініціалізувати різними способами за допомогою конструкторів.
Важливі запитання про Java
Q1. Чи можемо ми перевантажити статичні методи?
відповідь:
Відповідь: ' Так ’. Ми можемо мати два або більше статичних методів з однаковою назвою, але відмінностями у вхідних параметрах. Наприклад, розглянемо наступну програму Java. Щоб дізнатися більше про це, зверніться до статті – Чи можемо ми перевантажувати або перевизначати статичні методи в Java?
Q2. Чи можемо ми перевантажувати методи, які відрізняються лише статичними ключовими словами?
відповідь:
ми не можна перевантажувати два методи в Java, якщо вони відрізняються лише статичним ключовим словом (кількість параметрів і типи параметрів однакові). Дивіться, наприклад, наступну програму Java. Зверніться до цього для отримання деталей.
Q3. Чи можемо ми перевантажити main() у Java?
відповідь:
Як і інші статичні методи, ми може перевантажити main() у Java.
Java
// Java program with overloaded main()>
import>
java.io.*;>
>
public>
class>
Test {>
>
// Normal main()>
>
public>
static>
void>
main(String[] args)>
>
{>
>
System.out.println(>
'Hi Geek (from main)'>
);>
>
Test.main(>
'Geek'>
);>
>
}>
>
>
// Overloaded main methods>
>
public>
static>
void>
main(String arg1)>
>
{>
>
System.out.println(>
'Hi, '>
+ arg1);>
>
Test.main(>
'Dear Geek'>
,>
'My Geek'>
);>
>
}>
>
>
public>
static>
void>
main(String arg1, String arg2)>
>
{>
>
System.out.println(>
'Hi, '>
+ arg1 +>
', '>
+ arg2);>
>
}>
}>
>>ВихідHi Geek (from main) Hi, Geek Hi, Dear Geek, My Geek>
Q4. Чи підтримує Java перевантаження операторів?
відповідь:
На відміну від C++, Java не допускає перевантажених операторів, визначених користувачем. Внутрішньо Java перевантажує оператори, наприклад, + перевантажується для конкатенації.
Q5. Чи можемо ми перевантажувати методи за типом повернення?
відповідь:
Ми не можемо перевантажувати за типом повернення. Ця поведінка така ж у C++. Зверніться до цього для отримання деталей.
Java
/*package whatever //do not write package name here */>
>
import>
java.io.*;>
>
public>
class>
Main {>
>
public>
int>
foo() {>
return>
10>
; }>
>
>
// compiler error: foo() is already defined>
>
public>
char>
foo() {>
return>
'a'>
; }>
>
>
public>
static>
void>
main(String args[]) {}>
}>
>>Помилка
./Main.java:8: error: method foo() is already defined in class Main public char foo() { return 'a'; } ^ 1 error>Однак методи перевантаження типу повернення можливі у випадках, коли тип даних функції, що викликається, явно вказано. Подивіться на приклади нижче:
Java
// Java program to demonstrate the working of method>
// overloading in static methods>
>
import>
java.io.*;>
>
public>
class>
Main {>
>
>
public>
static>
int>
foo(>
int>
a) {>
return>
10>
; }>
>
public>
static>
char>
foo(>
int>
a,>
int>
b) {>
return>
'a'>
; }>
>
>
public>
static>
void>
main(String args[])>
>
{>
>
System.out.println(foo(>
1>
));>
>
System.out.println(foo(>
1>
,>
2>
));>
>
}>
}>
>>Вихід10 a>Java
// Java program to demonstrate working of method>
// overloading in methods>
class>
A {>
>
public>
int>
foo(>
int>
a) {>
return>
10>
; }>
>
>
public>
char>
foo(>
int>
a,>
int>
b) {>
return>
'a'>
; }>
}>
>
public>
class>
Main {>
>
>
public>
static>
void>
main(String args[])>
>
{>
>
A a =>
new>
A();>
>
System.out.println(a.foo(>
1>
));>
>
System.out.println(a.foo(>
1>
,>
2>
));>
>
}>
}>
>>Вихід10 a>
Q6. Яка різниця між перевантаженням і перевизначенням?
відповідь:
Перевантаження — це приблизно та сама функція, що має різні сигнатури. Перевизначення йдеться про ту саму функцію та той самий підпис, але різні класи, пов’язані через успадкування.
підкачка пам'яті![]()
Перевантаження є прикладом поліморфізму часу компіляції, а перевизначення є прикладом поліморфізму часу виконання.
Схожі статті
- Різні способи перевантаження методів у Java
- Перевантаження методу та помилка Null у Java
- Чи можемо ми перевантажувати або перевизначати статичні методи в java?