Polimorfizm Java (z przykładami)

W tym samouczku nauczymy się polimorfizmu języka Java i jego implementacji na przykładach.

Polimorfizm to ważna koncepcja programowania obiektowego. Oznacza po prostu więcej niż jedną formę.

Oznacza to, że ta sama jednostka (metoda, operator lub obiekt) może wykonywać różne operacje w różnych scenariuszach.

Przykład: polimorfizm języka Java

 class Polygon ( // method to render a shape public void render() ( System.out.println("Rendering Polygon… "); ) ) class Square extends Polygon ( // renders Square public void render() ( System.out.println("Rendering Square… "); ) ) class Circle extends Polygon ( // renders circle public void render() ( System.out.println("Rendering Circle… "); ) ) class Main ( public static void main(String() args) ( // create an object of Square Square s1 = new Square(); s1.render(); // create an object of Circle Circle c1 = new Circle(); c1.render(); ) )

Wynik

 Rendering Square… Rendering Circle… 

W powyższym przykładzie utworzyliśmy nadklasę: Wielokąt i dwie podklasy: Kwadrat i Okrąg. Zwróć uwagę na użycie render()metody.

Głównym celem render()metody jest odwzorowanie kształtu. Jednak proces renderowania kwadratu różni się od procesu renderowania koła.

W związku z tym render()metoda zachowuje się inaczej w różnych klasach. Lub możemy powiedzieć, że render()jest polimorficzny.

Dlaczego polimorfizm?

Polimorfizm pozwala nam tworzyć spójny kod. W poprzednim przykładzie możemy również stworzyć różne metody: renderSquare()i renderCircle()renderować odpowiednio Kwadrat i Okrąg.

To zadziała idealnie. Jednak dla każdego kształtu musimy stworzyć inne metody. Spowoduje to, że nasz kod będzie niespójny.

Aby rozwiązać ten problem, polimorfizm w Javie pozwala nam stworzyć jedną metodę, render()która będzie zachowywać się inaczej dla różnych kształtów.

Uwaga : print()metoda jest również przykładem polimorfizmu. Jest on używany do drukowania wartości różnych typów podoba char, int, string, etc.

Możemy osiągnąć polimorfizm w Javie na następujące sposoby:

  1. Zastępowanie metody
  2. Przeciążanie metod
  3. Przeciążanie operatorów

Zastępowanie metody Java

Podczas dziedziczenia w Javie, jeśli ta sama metoda jest obecna zarówno w nadklasie, jak i podklasie. Następnie metoda w podklasie zastępuje tę samą metodę w nadklasie. Nazywa się to przesłanianiem metody.

W takim przypadku ta sama metoda wykona jedną operację w nadklasie i inną operację w podklasie. Na przykład,

Przykład 1: Polimorfizm z nadpisywaniem metody

 class Language ( public void displayInfo() ( System.out.println("Common English Language"); ) ) class Java extends Language ( @Override public void displayInfo() ( System.out.println("Java Programming Language"); ) ) class Main ( public static void main(String() args) ( // create an object of Java class Java j1 = new Java(); j1.displayInfo(); // create an object of Language class Language l1 = new Language(); l1.displayInfo(); ) )

Wyjście :

 Język programowania Java Wspólny język angielski

W powyższym przykładzie utworzyliśmy nadklasę o nazwie Język i podklasę o nazwie Java. Tutaj metoda displayInfo()jest obecna zarówno w języku, jak i w Javie.

Służy displayInfo()do drukowania informacji. Jednak drukuje różne informacje w języku i Javie.

Na podstawie obiektu używanego do wywołania metody drukowane są odpowiednie informacje.

Działanie polimorfizmu Java

Uwaga : wywołana metoda jest określana podczas wykonywania programu. Dlatego przesłanianie metody jest polimorfizmem w czasie wykonywania .

2. Przeciążanie metod Java

W klasie Java możemy tworzyć metody o tej samej nazwie, jeśli różnią się parametrami. Na przykład,

 void func() (… ) void func(int a) (… ) float func(double a) (… ) float func(int a, float b) (… )

W Javie jest to znane jako przeciążanie metod. Tutaj ta sama metoda wykona różne operacje na podstawie parametru.

Przykład 3: Polimorfizm przy użyciu przeciążania metody

 class Pattern ( // method without parameter public void display() ( for (int i = 0; i < 10; i++) ( System.out.print("*"); ) ) // method with single parameter public void display(char symbol) ( for (int i = 0; i < 10; i++) ( System.out.print(symbol); ) ) ) class Main ( public static void main(String() args) ( Pattern d1 = new Pattern(); // call method without any argument d1.display(); System.out.println(""); // call method with a single argument d1.display('#'); ) )

Wyjście :

 ********** ##########

W powyższym przykładzie utworzyliśmy klasę o nazwie Pattern. Klasa zawiera metodę o nazwie, display()która jest przeciążona.

 // method with no arguments display() (… ) // method with a single char type argument display(char symbol) (… )

Tutaj główną funkcją programu display()jest drukowanie wzoru. Jednak na podstawie przekazanych argumentów metoda wykonuje różne operacje:

  • wypisuje wzorzec *, jeśli nie podano argumentu lub
  • wyświetla wzorzec parametru, jeśli charprzekazano pojedynczy argument typu.

Uwaga : wywoływana metoda jest określana przez kompilator. Dlatego jest również znany jako polimorfizm w czasie kompilacji.

3. Przeciążanie operatorów Java

Niektóre operatory w Javie zachowują się inaczej z różnymi operandami. Na przykład,

  • + operator jest przeciążony, aby wykonać dodawanie liczbowe, a także konkatenację ciągów, a
  • operatory takie jak &, |i !są przeciążone dla operacji logicznych i bitowych.

Zobaczmy, jak możemy osiągnąć polimorfizm za pomocą przeciążania operatorów.

+Operator służy do dodawania dwa podmioty. Jednak w Javie +operator wykonuje dwie operacje.

1. Gdy +jest używany z liczbami (liczbami całkowitymi i liczbami zmiennoprzecinkowymi), wykonuje matematyczne dodawanie. Na przykład,

 int a = 5; int b = 6; // + with numbers int sum = a + b; // Output = 11

2. Kiedy używamy +operatora ze stringami, wykona on konkatenację łańcuchów (połączy dwa łańcuchy). Na przykład,

 String first = "Java "; String second = "Programming"; // + with strings name = first + second; // Output = Java Programming

Here, we can see that the + operator is overloaded in Java to perform two operations: addition and concatenation.

Note: In languages like C++, we can define operators to work differently for different operands. However, Java doesn't support user-defined operator overloading.

Polymorphic Variables

A variable is called polymorphic if it refers to different values under different conditions.

Object variables (instance variables) represent the behavior of polymorphic variables in Java. It is because object variables of a class can refer to objects of its class as well as objects of its subclasses.

Example: Polymorphic Variables

 class ProgrammingLanguage ( public void display() ( System.out.println("I am Programming Language."); ) ) class Java extends ProgrammingLanguage ( @Override public void display() ( System.out.println("I am Object-Oriented Programming Language."); ) ) class Main ( public static void main(String() args) ( // declare an object variable ProgrammingLanguage pl; // create object of ProgrammingLanguage pl = new ProgrammingLanguage(); pl.display(); // create object of Java class pl = new Java(); pl.display(); ) )

Output:

 I am Programming Language. I am Object-Oriented Programming Language.

W powyższym przykładzie utworzyliśmy zmienną obiektową pl klasy ProgrammingLanguage. Tutaj pl jest zmienną polimorficzną. To dlatego, że,

  • W instrukcji pl = new ProgrammingLanguage()pl odnoszą się do obiektu klasy ProgrammingLanguage.
  • Mówiąc w skrócie pl = new Java(), pl odnosi się do obiektu klasy Java.

To jest przykład upcastingu w Javie.

Interesujące artykuły...