what is polymorphism java tutorial with examples
Цей підручник пояснює, що таке поліморфізм у Java, типи поліморфізму та як реалізувати поліморфізм під час компіляції на прикладах:
Слово 'поліморфізм' походить від двох слів, тобто “Полі” що означає багато і ' морфи ”Значення форми. Таким чином, поліморфізм означає багато форм. Мовою програмування можна сказати, що об’єкт може приймати різні форми, а отже, об’єкт є поліморфним.
Поліморфізм є однією з найважливіших особливостей ООП, і він дозволяє нам виражати ознаку (об’єкт або повідомлення, або метод, або оператор) у різних формах.
=> Подивіться тут посібник для початківців Java.
Що ви дізнаєтесь:
Вступ до поліморфізму на Java
Поліморфна сутність поводиться по-різному за різних сценаріїв.
Наприклад, розглянемо оператор ‘+’ (додавання) на Java. Це двійковий оператор і приймає два операнди. Коли операнди, які передаються оператору ‘+’, є числами, виконується операція додавання, яка повертає суму двох чисел.
Коли операнди змінюються на тип String, оператор ‘+’ не додає об’єкти String, а об’єднує або об’єднує вміст рядка, утворюючи результуючий третій рядок.
Наприклад, якщо “ один ”Та“ два ”- це вміст двох об’єктів String тоді “Один” + “два” призведе до “ один два '. Це конкатенація.
У Java всі об'єкти є поліморфними, оскільки всі вони є похідними від класу 'Object' і, таким чином, виконують зв'язок 'IS-A' з класом Object.
Доступ до об’єкта завжди здійснюється через посилальну змінну цього конкретного типу класу. Після оголошення посилальної змінної певного типу її неможливо змінити. Однак, якщо посилальна змінна не оголошена як „Остаточна”, ми можемо перепризначити її для вказівки на інші об’єкти.
Тип посилання на цей об'єкт визначатиме методи та функції класу, які слід викликати.
Наприклад,якщо існує клас ABC та клас XYZ, похідні від ABC, обидва класи мають поліморфний метод func ().
Основні запитання та відповіді для інтерв’ю для Java
class ABC{ void func(){} } class XYZ extends ABC{ void func() {} }
Давайте створимо посилання типу ABC.
obj = new XYZ ();
Тепер, коли ми викликаємо метод func (), оскільки об'єкт, на який вказує obj, є класом XYZ, буде викликаний метод func () з класу XYZ.
Як ми бачили у наведеному вище прикладі, метод func () має різні реалізації, але однаковий прототип. Залежно від об'єкта, на який вказує посилальний об'єкт, ми маємо відповідну реалізацію в цьому сценарії, що викликається. Це поліморфізм.
Давайте детально обговоримо поліморфізм на Java.
Приклад поліморфізму Java
Давайте розберемося в простому прикладі поліморфізму в Java з операцією додавання, про яку вже говорилося раніше.
Тут ми використовуємо два методи з однаковим іменем, але різними параметрами. Перша функція приймає два цілочисельні параметри, а друга - два рядкові параметри.
Залежно від типу переданих параметрів викликається відповідний метод, який або додає два цілих числа, і друкує результат, або об'єднує два рядки і друкує результуючий рядок.
Програма Java наведена нижче:
class Addition_operation{ //method to add two integers void addition_func(int num1,int num2){ System.out.println('ABC::addition_func:' + (num1+num2)); } //overloaded method to add two strings void addition_func(String str1, String str2){ String result = str1 + ' ' + str2; System.out.println('XYZ::addition_func:' + result); } } public class Main { public static void main(String() args) { Addition_operation abc = new Addition_operation(); //create a class object abc.addition_func (3,4); //calls 1st method abc.addition_func ('Hello' , 'World!'); //calls 2nd method } }
Вихід:
Тут ми побачили, що коли ми вперше передаємо два цілочисельні параметри в додаток_функції, тоді викликається перший метод. У другому виклику функції ми передаємо два параметри типу String, і, отже, викликається другий перевантажений метод.
Види поліморфізму
Java підтримує два типи поліморфізму:
- Компілятивний поліморфізм
- Поліморфізм під час виконання
Як випливає з назви, поліморфізм під час компіляції виконується під час компіляції, а поліморфізм під час виконання виконується під час виконання.
Як показано на наведеному малюнку, поліморфізм компіляції реалізується за допомогою перевантаження. Ми можемо перевантажити або метод, або оператор. Поліморфізм часу виконання досягається за допомогою заміщення.
У цьому уроці ми детально обговоримо поліморфізм компіляції. Ми розглянемо поліморфізм виконання під час наступного уроку.
Поліморфізм компіляції в Java
Поліморфізм під час компіляції також відомий як 'статичний поліморфізм'. Як частина поліморфізму під час компіляції, будь-який поліморфізм, який потрібно виконати, виконується під час компіляції.
На Java поліморфізм під час компіляції виконується за допомогою “ Метод Перевантаження '. Використовуючи перевантаження методів, ми можемо мати один або кілька методів з однаковим іменем і диференційованими лише за номерами, типом чи порядком параметрів.
Перевантаження методів - найпоширеніша реалізація поліморфізму часу компіляції в Java. Java також підтримує перевантаження оператора.
Що таке перевантаження в Java загалом?
Перевантаження в Java - це процес наявності більше одного методу з однаковим іменем і типом повернення, але різниться в послідовності, кількості та типах аргументів. Це також називається методом перевантаження в цілому.
Перевантаження методу в Java
Перевантаження методів - це реалізація поліморфізму часу компіляції в Java. Коли у нас є один або кілька методів з однаковим іменем та / або типами повернення, але різними списками параметрів, ми говоримо, що ми «перевантажили» методи.
Отже, у даному класі ми можемо мати різні методи з однаковим іменем, але різними списками аргументів.
Як ми викликаємо перевантажені методи? Або як компілятор знає, який метод слід викликати?
Виклик точного методу, який відповідає виклику, виконується залежно від списку параметрів.
Ми вже бачили, що клас в Java може мати більше одного конструктора. У випадку з конструкторами, список аргументів або аргументи, які приймає конструктор, відрізняється у всіх конструкторах. Це приклад перевантаження. Отже, перевантаження конструктора - це основна форма перевантаження методів у Java.
Тепер давайте подивимося, як перевантажити метод на Java?
Java забезпечує три способи перевантаження методів залежно від змін у списку параметрів / аргументів.
# 1) Тип параметрів
Ми можемо перевантажувати методи в Java залежно від типу даних параметрів.
Розглянемо наступний приклад, де ми навели прототипи трьох методів.
додавання (int, int);
додавання (int, float);
додавання (Рядок, Рядок);
Як видно з вище, у нас однакове ім'я методу у всіх трьох випадках і однакова кількість параметрів, але кожен виклик методу має різні типи параметрів.
Отже, поки методи мають різні типи параметрів, ми можемо сказати, що методи перевантажені. Коли ми викликаємо метод, компілятор приймає рішення про тип даних параметра, і залежно від типу даних списку параметрів, що надається із викликом методу, викликається відповідний метод.
Наприклад,якщо у нас є виклик методу, як показано нижче:
додавання (3, 3,5);
У наведеному вище виклику методу ми бачимо, що перший параметр має тип int, а другий - тип float. Коли зустрічається вищезазначений виклик, компілятор вирішує список параметрів, а потім викликає відповідний метод, який є другим вищенаведеним методом.
Тепер давайте реалізуємо повну програму Java, щоб продемонструвати перевантаження методу на основі типів даних параметрів.
class MethodOverload { //overloaded method - char parameter public void printParam(char ch) { System.out.println('Input character:' + ch); } //overloaded method - int parameter public void printParam(int num) { System.out.println('Input Number:' + num); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A'); //call overloaded method (char ) obj.printParam(10); //call overloaded method (int ) } }
Вихід:
# 2) Кількість параметрів
Інша реалізація методу перевантаження - це перевантаження методів з різною кількістю параметрів у виклику функції.
Наприклад,давайте розглянемо такі декларації методів:
addnum (int, int);
addnum (int, int, int);
У наведених вище деклараціях методів перша декларація методу має два параметри, а друга декларація має три параметри. Коли функція викликається, компілятор перевіряє кількість параметрів, а потім належним чином вирішує виклик методу.
У наведеному нижче прикладі показана програма, яка використовує перевантаження методів на основі кількості параметрів.
class MethodOverload { //overloaded method - 1 parameter public void printParam(char ch) { System.out.println(ch); } //overloaded method - 2 parameters public void printParam(char ch, int num) { System.out.println('Character: ' + ch + ' ; '+ 'Number:' +num); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A'); //call overloaded method (1 ) obj.printParam('A',10); //call overloaded method (2 ) } }
Вихід:
У цьому прикладі ми маємо два методи, перевантажені залежно від кількості параметрів. Перший метод приймає один параметр, а другий метод приймає два параметри. У основному методі ми викликаємо обидва методи один за одним, і компілятор вирішує виклик функції залежно від кількості вказаних параметрів.
# 3) Послідовність параметрів
Третій підхід реалізації перевантаження методів заснований на послідовності параметрів в перевантажених методах.
Розглянемо наступний приклад декларації методу,
сума (int, float);
сума (float, int);
Тут ми маємо перевантажену суму методу. У першій декларації параметри є int та float. У другій декларації параметри також є int та float, але їх порядок у списку параметрів змінено.
Тепер параметр float з’являється першим, а параметр int - другим. Ми можемо досягти перевантаження методу, змінивши порядок параметрів.
нижче програма Java це демонструє.
class MethodOverload { //overloaded method - char,int parameter public void printParam(char ch, int num) { System.out.println('Input character:' + ch + ' ; ' + 'Input Number:' + num); } //overloaded method - int,char parameter public void printParam(int num, char ch) { System.out.println('Input Number:' + num + ' ; ' + 'Input Character:' + ch); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A', 100); //call overloaded method (char,int) obj.printParam(100, 'A'); //call overloaded method (int,char) } }
Вихід:
У наведеній вище програмі ми маємо перевантажений метод printParam, який має параметри int та char, порядок яких змінюється у двох оголошеннях методів.
Недійсні випадки перевантаження методів
Наразі ми обговорювали перевантаження методів за допомогою списку параметрів. Ми ще не розглядали метод повернення. Зверніть увагу, що ми не перевантажуємо методи, засновані на типах повернення.
Наприклад, якщо два методи мають одне і те ж ім'я та однакові списки параметрів, але різні типи повернення, тоді ми не говоримо, що ці два методи перевантажені. Цей випадок стає недійсним для перевантаження.
Отже, якщо ми маємо такі декларації:
Я int (int, int);
Рядкова сума (int, int);
У цьому випадку компілятор видасть помилку, оскільки два методи не перевантажені. Отже, виходячи виключно з типів повернення, методи не диференційовані.
Давайте продемонструємо цей невірний випадок за допомогою програми Java.
class OverloadDemo { public double myMethod(int num1, int num2) { System.out.println('OverloadDemo::myMethod returns double'); return num1+num2; } public int myMethod(int var1, int var2) { System.out.println('OverloadDemo::myMethod returns int'); return var1-var2; } } class Main { public static void main(String args()) { OverloadDemo obj2= new OverloadDemo(); obj2.myMethod(10,10); obj2.myMethod(20,12); } }
У наведеній вище програмі метод myMethod має два прототипи. Один прототип приймає два параметри int і повертає подвійний. Прототип другого методу приймає два параметри int і повертає int.
Отже, коли ми компілюємо цю програму, ми отримуємо наведені нижче результати.
Вихід:
Вищенаведена помилка компіляції вказує на те, що метод оголошується двічі. Це означає, що компілятор не вважає ці методи перевантаженими лише на основі типу повернення.
Перевантаження оператора
Перевантаження оператора - це механізм перевантаження, в якому інше значення надається існуючому оператору.
Як ми вже обговорювали у вступному розділі цього посібника, оператор додавання ‘+’ є класичним прикладом перевантаження оператора.
Коли операнди цього оператора є числовими, тоді оператор + повертає загальну суму двох значень. Але коли операнди мають тип 'Рядок', то результатом операції додавання є об'єднаний рядок. Зауважте, що в Java ми можемо перевантажити лише оператор + (додавання).
Цей оператор виконує дві функції:
- Додавання цілих чи числових значень.
- Конкатенація рядків
Отже, підтримка перевантаження оператора в Java обмежена, на відміну від C ++, де ми можемо перевантажити майже всі оператори, за винятком кількох, таких як sizeof, dot operator тощо
Наведена нижче програма демонструє перевантаження оператора в Java.
class OperatorOverload { //overloaded method for concatenating two strings void operator(String str1, String str2) { String resultStr = str1 + str2; System.out.println('Concatenated String: ' + resultStr); } //overloaded method for adding two numbers void operator(int num1, int num2) { int result = num1 + num2; System.out.println('Sum of two numbers : ' + result); } } class Main { public static void main(String() args) { OperatorOverload obj = new OperatorOverload(); obj.operator(10, 15); //add two numbers obj.operator('Hello ', 'World!!'); //concatenate two strings } }
Вихід:
У наведеній вище програмі ми перевантажили оператор ‘+’. Коли ми передаємо два цілі значення перевантаженому методу, повертається сума двох цілих чисел, і коли передаються два рядки, результатом є об'єднаний рядок.
Деякі моменти, на які слід звернути увагу щодо перевантаження та поліморфізму під час компіляції.
- Перевантаження методів - це спосіб реалізації поліморфізму під час компіляції, який також відомий як статичний поліморфізм.
- Статичний поліморфізм також відомий як раннє зв'язування або зв'язування під час компіляції.
- Оскільки прив'язка параметрів і виклик функції відбувається під час компіляції, перевантаження називається прив'язкою часу компіляції.
- Ми можемо лише перевантажити оператор «+» в Java, і він виконує додавання двох цілих чи конкатенацію двох рядків.
Часті запитання
Q # 1) Навіщо нам потрібен поліморфізм у Java?
Відповідь: Поліморфізм дозволяє нам мати багато реалізацій для одного об'єкта. Через перевантаження методів нам не потрібно мати занадто багато методів з різними іменами, які важко запам’ятати. Натомість ми можемо мати перевантажені методи, щоб мати чітку реалізацію методів, що виконують подібні функції.
Також перевизначення допоміжних засобів у правильній реалізації успадкування, що дозволяє нам простіше додати більше функціональності до існуючих класів.
Q # 2) Що таке поліморфізм ООП?
Відповідь: Визначення поліморфізму об’єктно-орієнтованого програмування стосується здатності мов програмування реалізовувати один об’єкт у різних формах. Поліморфізм також визначається як здатність програми замінювати методи з батьківського класу на похідний клас, щоб мати додаткову функціональність.
Q # 3) Чи можемо ми перевантажити та замінити основний метод?
Відповідь: Ні. Ми не можемо замінити основний статичний метод. Хоча ми можемо перевантажити основний метод, JVM ніколи не буде викликати перевантажений основний метод. Тож найкраща відповідь - не перевантажувати та не перевизначати основний метод.
Q # 4) Чи можна конструктори перевантажити?
Відповідь: Так, ми можемо перевантажити конструктори в Java так само, як і методи Java. Конструктори зазвичай мають однакові назви, але різну кількість аргументів.
Q # 5) Чому перевантаження методів корисно?
Відповідь: Ми можемо писати чистий код, використовуючи метод перевантаження, і він також стає читабельним, оскільки у нас є методи з тим самим іменем. Отже, якщо ми реалізуємо функціональність для різних типів даних, тоді ми можемо перевантажити методи, і буде простіше відокремити код.
різниця між альфа-тестуванням і бета-тестуванням
Висновок
Поліморфізм на Java означає, що об’єкт може мати багато форм. Поліморфізм у Java має два типи, тобто поліморфізм компіляції та поліморфізм середовища виконання. Поліморфізм під час компіляції виконується під час компіляції. Поліморфізм часу компіляції є статичним і реалізується через перевантаження методів та перевантаження оператора.
Поліморфізм виконання виконується під час виконання і є динамічним. Він реалізований за допомогою перевизначення методу.
У цьому підручнику ми побачили способи реалізації перевантаження методів. Ми також детально обговорили перевантаження оператора. Java підтримує перевантаження оператора «+» лише.
=> Прочитайте серію Easy Java Training.
Рекомендована література
- Рядок Java містить () Підручник із методів із прикладами
- Довжина рядка Java () Метод із прикладами
- Метод підстроки Java () - Підручник із прикладами
- Підручник з Java Float із прикладами програмування
- Підручник JAVA для початківців: 100+ практичних відео-підручників Java
- TreeMap в Java - Підручник з прикладами Java TreeMap
- Підручник із рядків Java | Рядові методи Java на прикладах
- Двомісний підручник з прикладами програмування