logo

Перевантаження методів у Java

У 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

Розглянемо приклад, щоб прояснити концепцію:

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

Перевантаження є прикладом поліморфізму часу компіляції, а перевизначення є прикладом поліморфізму часу виконання.

Схожі статті

  • Різні способи перевантаження методів у Java
  • Перевантаження методу та помилка Null у Java
  • Чи можемо ми перевантажувати або перевизначати статичні методи в java?