what is polymorphism java tutorial with examples
Ten samouczek wyjaśnia, czym jest polimorfizm w Javie, typy polimorfizmu i jak zaimplementować polimorfizm w czasie kompilacji z przykładami:
Słowo „polimorfizm” pochodzi od dwóch słów, tj. „Poly” co oznacza wiele i „ przekształcenia ”Znaczenie formy. Zatem polimorfizm oznacza wiele form. W języku programowania możemy powiedzieć, że obiekt może przybierać różne formy, a zatem jest on polimorficzny.
Polimorfizm jest jedną z najważniejszych cech OOP i pozwala nam wyrazić cechę (obiekt, wiadomość, metodę lub operator) w różnych formach.
=> Zapoznaj się z podręcznikiem Java dla początkujących tutaj.
Czego się nauczysz:
Wprowadzenie do polimorfizmu w Javie
Jednostka polimorficzna zachowuje się różnie w różnych scenariuszach.
Na przykład, weź pod uwagę operator „+” (dodawanie) w Javie. To jest operator binarny i przyjmuje dwa operandy. Gdy operandy przekazywane do operatora „+” są liczbami, wykonywana jest operacja dodawania, która zwraca sumę dwóch liczb.
Gdy operandy zmieniają się na typ String, operator „+” nie dodaje obiektów String, ale konkatenuje lub łączy zawartość ciągu, tworząc wynikowy trzeci ciąg.
Na przykład, gdyby ' jeden ' i ' dwa ”To zawartość dwóch obiektów typu String „Jeden” + „dwa” spowoduje „ onetwo ”. To jest konkatenacja.
W Javie wszystkie obiekty są polimorficzne, ponieważ wszystkie pochodzą z klasy „Object”, a zatem spełniają relację „IS-A” z klasą Object.
Dostęp do obiektu jest zawsze uzyskiwany poprzez zmienną referencyjną określonego typu klasy. Po zadeklarowaniu zmiennej referencyjnej określonego typu nie można jej modyfikować. Jeśli jednak zmienna odniesienia nie jest zadeklarowana jako „Final”, możemy ją ponownie przypisać, aby wskazywała na inne obiekty.
Typ tego odwołania do obiektu decyduje o metodach klas lub funkcjach, które powinny zostać wywołane.
Na przykład,jeśli istnieje klasa ABC i klasa XYZ wywodząca się z ABC, obie klasy mają polimorficzną metodę func ().
class ABC{ void func(){} } class XYZ extends ABC{ void func() {} }
Utwórzmy odniesienie typu ABC.
obj = new XYZ ();
Teraz, kiedy wywołamy metodę func (), ponieważ obiekt wskazywany przez obj jest klasy XYZ, zostanie wywołana metoda func () z klasy XYZ.
Jak widzieliśmy w powyższym przykładzie, metoda func () ma różne implementacje, ale ten sam prototyp. W zależności od obiektu wskazywanego przez obiekt referencyjny mamy wywołaną odpowiednią implementację w tym scenariuszu. To jest polimorfizm.
Omówmy szczegółowo polimorfizm w Javie.
Przykład polimorfizmu języka Java
Rozumiemy prosty przykład polimorfizmu w Javie z operacją dodawania, jak omówiono wcześniej.
Tutaj używamy dwóch metod o tej samej nazwie, ale różnych parametrach. Pierwsza funkcja akceptuje dwa parametry całkowite, a druga metoda przyjmuje dwa parametry łańcuchowe.
W zależności od typu przekazanych parametrów wywoływana jest odpowiednia metoda i albo dodaje dwie liczby całkowite i drukuje wynik, albo łączy dwa ciągi i drukuje otrzymany ciąg.
Program Java jest podany poniżej:
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 } }
Wynik:
Tutaj widzieliśmy, że kiedy po raz pierwszy przekazujemy dwa parametry całkowite do add_func, wywoływana jest pierwsza metoda. W drugim wywołaniu funkcji przekazujemy dwa parametry typu String i stąd wywoływana jest druga przeciążona metoda.
Rodzaje polimorfizmu
Java obsługuje dwa typy polimorfizmu:
- Polimorfizm w czasie kompilacji
- Polimorfizm w czasie wykonywania
Jak sama nazwa wskazuje, polimorfizm w czasie kompilacji jest wykonywany w czasie kompilacji, a polimorfizm w czasie wykonywania jest wykonywany w czasie wykonywania.
Jak pokazano na powyższym rysunku, polimorfizm w czasie kompilacji jest implementowany przez Przeciążanie. Możemy przeciążać metodę lub operator. Polimorfizm w czasie wykonywania osiąga się poprzez nadpisywanie.
W tym samouczku szczegółowo omówimy polimorfizm w czasie kompilacji. W następnym samouczku zajmiemy się polimorfizmem w czasie wykonywania.
Polimorfizm czasu kompilacji w Javie
Polimorfizm w czasie kompilacji jest również znany jako „polimorfizm statyczny”. Jako część polimorfizmu w czasie kompilacji, dowolny polimorfizm, który ma być wykonany, jest wykonywany w czasie kompilacji.
jakie jest najlepsze oprogramowanie szpiegujące dla telefonów komórkowych
W Javie polimorfizm w czasie kompilacji jest wykonywany przy użyciu „ Przeciążanie metod ”. Korzystając z przeciążania metod, możemy mieć jedną lub więcej metod o tej samej nazwie i rozróżnianych tylko na podstawie liczb lub typu lub kolejności parametrów.
Przeciążanie metod jest najpowszechniejszą implementacją polimorfizmu w czasie kompilacji w Javie. Java obsługuje również przeciążanie operatorów.
Co to jest ogólnie przeciążanie w Javie?
Przeciążanie w Javie to proces polegający na posiadaniu więcej niż jednej metody o tej samej nazwie i zwracanym typie, ale różniącej się kolejnością, liczbą i typami argumentów. Nazywa się to również ogólnie przeciążaniem metod.
Przeciążanie metod w Javie
Przeciążanie metod to implementacja polimorfizmu czasu kompilacji w Javie. Kiedy mamy jedną lub więcej metod o tej samej nazwie i / lub typach zwracanych, ale z różnymi listami parametrów, mówimy, że „przeciążaliśmy” metody.
Zatem w danej klasie możemy mieć różne metody o tej samej nazwie, ale z różnymi listami argumentów.
Jak wywołać przeciążone metody? Albo skąd kompilator wie, którą metodę należy wywołać?
Wywołanie dokładnej metody, która pasuje do wywołania, jest wykonywane w zależności od listy parametrów.
Widzieliśmy już, że klasa w Javie może mieć więcej niż jeden konstruktor. W przypadku konstruktorów lista argumentów lub argumenty, które akceptuje konstruktor, są różne we wszystkich konstruktorach. To jest przykład przeciążenia. Zatem przeciążanie konstruktorów jest podstawową formą przeciążania metod w Javie.
Zobaczmy teraz, jak przeciążać metodę w Javie?
Java udostępnia trzy sposoby przeciążania metod w zależności od wariacji na liście parametrów / argumentów.
# 1) Typ parametrów
Możemy przeciążać metody w Javie w zależności od typu danych parametrów.
Rozważmy następujący przykład, w którym podaliśmy prototypy trzech metod.
dodanie (int, int);
dodawanie (int, float);
dodawanie (ciąg, ciąg);
Jak widać z powyższego, we wszystkich trzech przypadkach mamy tę samą nazwę metody i tę samą liczbę parametrów, ale każde wywołanie metody ma różne typy parametrów.
Tak długo, jak metody mają różne typy parametrów, możemy powiedzieć, że metody są przeciążone. Kiedy wywołujemy metodę, kompilator decyduje o typie danych parametru iw zależności od typu danych listy parametrów dostarczonej z wywołaniem metody, wywoływana jest odpowiednia metoda.
Na przykład,jeśli mamy wywołanie metody, jak poniżej:
dodatek (3, 3,5);
W powyższym wywołaniu metody widzimy, że pierwszy parametr jest typu int, a drugi parametr jest typu float. Po napotkaniu powyższego wywołania kompilator rozwiązuje listę parametrów, a następnie wywołuje odpowiednią metodę, która jest drugą metodą powyżej.
Zaimplementujmy teraz kompletny program w języku Java, aby zademonstrować przeciążanie metod na podstawie typów danych parametrów.
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 ) } }
Wynik:
# 2) Liczba parametrów
Inną implementacją przeciążania metod jest przeciążanie metod z inną liczbą parametrów w wywołaniu funkcji.
Na przykład,rozważmy następujące deklaracje metod:
addnum (int, int);
addnum (int, int, int);
W powyższych deklaracjach metod pierwsza deklaracja metody ma dwa parametry, a druga deklaracja ma trzy parametry. Gdy funkcja jest wywoływana, kompilator sprawdza liczbę parametrów, a następnie odpowiednio rozwiązuje wywołanie metody.
Poniższy przykład przedstawia program, który używa przeciążania metod na podstawie liczby parametrów.
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 ) } }
Wynik:
W tym przykładzie mamy przeciążone dwie metody na podstawie liczby parametrów. Pierwsza metoda przyjmuje jeden parametr, a druga metoda przyjmuje dwa parametry. W głównej metodzie wywołujemy obie metody jedna po drugiej, a kompilator rozwiązuje wywołanie funkcji w zależności od liczby określonych parametrów.
# 3) Sekwencja parametrów
Trzecie podejście do implementacji przeciążania metod jest oparte na sekwencji parametrów w przeciążonych metodach.
Rozważmy następujący przykład deklaracji metody,
sum (int, float);
sum (float, int);
Tutaj mamy przeciążoną sumę metody. W pierwszej deklaracji parametry to int i float. Również w drugiej deklaracji parametry to int i float, ale ich kolejność na liście parametrów zostaje zmieniona.
Teraz parametr float pojawia się jako pierwszy, podczas gdy parametr int jest drugi. Przeciążenie metod możemy osiągnąć poprzez zmianę kolejności parametrów.
Plik poniżej program Java demonstruje to.
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) } }
Wynik:
W powyższym programie mamy przeciążoną metodę printParam, która ma parametry int i char, których kolejność jest zmieniana w dwóch deklaracjach metod.
Nieprawidłowe przypadki przeciążenia metody
Do tej pory omawialiśmy przeciążanie metod za pomocą listy parametrów. Nie rozważaliśmy jeszcze zwracanego typu metody. Pamiętaj, że nie przeciążamy metod opartych na zwracanych typach.
Na przykład, jeśli dwie metody mają tę samą nazwę i te same listy parametrów, ale różne typy zwracanych wartości, nie mówimy, że te dwie metody są przeciążone. Ten przypadek staje się nieważny z powodu przeciążenia.
A więc jeśli mamy następujące deklaracje:
I int (int, int);
Suma ciągów (int, int);
W takim przypadku kompilator zgłosi błąd, ponieważ dwie metody nie są przeciążone. W związku z tym metody nie są rozróżniane wyłącznie na podstawie zwracanych typów.
Pokażmy ten nieprawidłowy przypadek za pomocą programu w języku 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); } }
W powyższym programie metoda myMethod ma dwa prototypy. Jeden prototyp przyjmuje dwa parametry int i zwraca wartość double. Prototyp drugiej metody przyjmuje dwa parametry int i zwraca wartość int.
Więc kiedy kompilujemy ten program, otrzymujemy poniższe dane wyjściowe.
Wynik:
Powyższy błąd kompilacji wskazuje, że metoda została zadeklarowana dwukrotnie. Oznacza to, że kompilator nie traktuje tych metod jako przeciążonych wyłącznie na podstawie zwracanego typu.
Przeciążanie operatorów
Przeciążanie operatorów to mechanizm przeciążania, w którym istniejący operator ma inne znaczenie.
Jak omówiliśmy we wprowadzeniu do tego samouczka, operator dodawania „+” jest klasycznym przykładem przeciążenia operatora.
Gdy operandy tego operatora są liczbami, operator + zwraca sumę dwóch wartości. Ale jeśli operandy są typu String, wynikiem operacji dodawania jest połączony łańcuch. Zauważ, że w Javie możemy tylko przeciążać operator + (dodawanie).
Ten operator pełni dwie funkcje:
jak zrobić fałszywą wiadomość e-mail
- Dodawanie liczb całkowitych lub wartości liczbowych.
- Łączenie ciągów
Stąd obsługa przeciążania operatorów jest ograniczona w Javie, w przeciwieństwie do C ++, w którym możemy przeciążać prawie wszystkie operatory, z wyjątkiem kilku, takich jak sizeof, operator kropki itp.
Poniższy program demonstruje przeciążanie operatorów w Javie.
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 } }
Wynik:
W powyższym programie przeładowaliśmy operator „+”. Kiedy przekazujemy dwie wartości całkowite do przeciążonej metody, zwracana jest suma dwóch liczb całkowitych, a po przekazaniu dwóch ciągów wynikiem jest połączony ciąg.
Należy zwrócić uwagę na pewne kwestie dotyczące przeciążenia i polimorfizmu w czasie kompilacji.
- Przeciążanie metod to sposób na zaimplementowanie polimorfizmu w czasie kompilacji, znanego również jako polimorfizm statyczny.
- Statyczny polimorfizm jest również znany jako wczesne wiązanie lub wiązanie w czasie kompilacji.
- Ponieważ wiązanie parametrów i wywołanie funkcji ma miejsce w czasie kompilacji, przeciążenie jest nazywane wiązaniem w czasie kompilacji.
- W Javie możemy przeciążyć tylko operator „+” i wykonuje on dodanie dwóch liczb całkowitych lub konkatenację dwóch ciągów.
Często Zadawane Pytania
Pytanie 1) Dlaczego potrzebujemy polimorfizmu w Javie?
Odpowiedź: Polimorfizm pozwala nam mieć wiele implementacji dla jednego obiektu. Dzięki przeciążeniu metod nie musimy mieć zbyt wielu metod o różnych nazwach, które są trudne do zapamiętania. Zamiast tego możemy mieć przeciążone metody, abyśmy mogli mieć jasną implementację metod wykonujących podobne funkcje.
Również nadpisywanie pomaga we właściwej implementacji dziedziczenia, co pozwala nam w łatwiejszy sposób dodawać więcej funkcjonalności do istniejących klas.
P # 2) Co to jest polimorfizm OOP?
Odpowiedź: Definicja polimorfizmu w programowaniu obiektowym odnosi się do zdolności języków programowania do implementacji jednego obiektu w różnych formach. Polimorfizm jest również definiowany jako zdolność programu do zastępowania metod z klasy nadrzędnej do klasy pochodnej w celu uzyskania dodatkowej funkcjonalności.
Pytanie 3) Czy możemy przeciążać i przesłonić główną metodę?
Odpowiedź: Nie. Nie możemy zastąpić statycznej metody głównej. Chociaż możemy przeciążać główną metodę, JVM nigdy nie wywoła przeciążonej metody głównej. Dlatego najlepszą odpowiedzią nie jest przeciążanie ani zastępowanie głównej metody.
P # 4) Czy konstruktorzy mogą być przeciążeni?
Odpowiedź: Tak, możemy przeciążać konstruktory w Javie w taki sam sposób, w jaki przeciążamy metody Javy. Konstruktorzy mają zwykle tę samą nazwę, ale różną liczbę argumentów.
Pytanie 5) Dlaczego przeciążanie metod jest przydatne?
Odpowiedź: Możemy napisać czysty kod przy użyciu przeładowania metod, a także staje się on czytelny, ponieważ mamy metody o tej samej nazwie. Jeśli więc implementujemy funkcjonalność dla różnych typów danych, wtedy możemy przeciążać metody i łatwiej będzie oddzielić kod.
Wniosek
Polimorfizm w Javie oznacza, że obiekt może mieć wiele form. Polimorfizm w Javie ma dwa typy, tj. Polimorfizm w czasie kompilacji i polimorfizm w czasie wykonywania. Polimorfizm w czasie kompilacji jest wykonywany w czasie kompilacji. Polimorfizm w czasie kompilacji jest statyczny i jest implementowany poprzez przeciążanie metod i operatorów.
Polimorfizm w czasie wykonywania jest wykonywany w czasie wykonywania i jest dynamiczny. Jest implementowany przy użyciu przesłaniania metody.
W tym samouczku widzieliśmy sposoby implementacji przeciążania metod. Omówiliśmy również szczegółowo przeciążanie operatorów. Java obsługuje tylko przeciążenie operatora „+”.
=> Przeczytaj serię szkoleń Easy Java.
rekomendowane lektury
- Java String zawiera () Samouczek dotyczący metody z przykładami
- Metoda Java String length () z przykładami
- Metoda substring () Java - samouczek z przykładami
- Samouczek Java Float z przykładami programowania
- Samouczek JAVA dla początkujących: ponad 100 praktycznych samouczków wideo Java
- TreeMap w Javie - samouczek z przykładami TreeMap w języku Java
- Samouczek dotyczący ciągów Java | Metody ciągów Java z przykładami
- Java Double - samouczek z przykładami programowania