Java polymorfism (med exempel)

I denna handledning lär vi oss om Java-polymorfism och dess implementering med hjälp av exempel.

Polymorfism är ett viktigt begrepp för objektorienterad programmering. Det betyder helt enkelt mer än en form.

Det vill säga samma enhet (metod eller operatör eller objekt) kan utföra olika operationer i olika scenarier.

Exempel: Java Polymorphism

 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(); ) )

Produktion

 Rendering Square … Rendering Circle … 

I exemplet ovan har vi skapat en superklass: Polygon och två underklasser: Square och Circle. Lägg märke till användningen av render()metoden.

Huvudsyftet med render()metoden är att återge formen. Processen med att rendera en kvadrat är dock annorlunda än processen att rendera en cirkel.

Därför render()beter sig metoden annorlunda i olika klasser. Eller, vi kan säga render()är polymorf.

Varför polymorfism?

Polymorfism tillåter oss att skapa konsekvent kod. I föregående exempel kan vi också skapa olika metoder: renderSquare()och renderCircle()att göra Square respektive Circle.

Detta kommer att fungera perfekt. För varje form måste vi dock skapa olika metoder. Det kommer att göra vår kod inkonsekvent.

För att lösa detta tillåter polymorfism i Java oss att skapa en enda metod render()som beter sig olika för olika former.

Obs : print()Metoden är också ett exempel på polymorfism. Det används för att skriva ut värden för olika typer som char, int, string, etc.

Vi kan uppnå polymorfism i Java på följande sätt:

  1. Metod Åsidosättande
  2. Metod Överbelastning
  3. Överbelastning av operatören

Java Method Overriding

Om samma metod finns i både superklassen och underklassen under arv i Java. Sedan åsidosätter metoden i underklassen samma metod i superklassen. Detta kallas metodöverstyrning.

I det här fallet kommer samma metod att utföra en operation i superklassen och en annan operation i underklassen. Till exempel,

Exempel 1: Polymorfism med metodöverstyrning

 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(); ) )

Utgång :

 Java-programmeringsspråk Common English Language

I exemplet ovan har vi skapat en superklass med namnet Språk och en underklass med namnet Java. Här finns metoden displayInfo()i både språk och Java.

Användningen displayInfo()är att skriva ut informationen. Det skriver emellertid ut annan information i språk och Java.

Baserat på objektet som används för att anropa metoden skrivs motsvarande information ut.

Arbeta med Java Polymorphism

Obs : Metoden som anropas bestäms under genomförandet av programmet. Följaktligen är metodöverstyrning en polymorfism under körning .

2. Java-metod Överbelastning

I en Java-klass kan vi skapa metoder med samma namn om de skiljer sig åt i parametrar. Till exempel,

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

Detta är känt som metodöverbelastning i Java. Här kommer samma metod att utföra olika operationer baserat på parametern.

Exempel 3: Polymorfism med metodöverbelastning

 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('#'); ) )

Utgång :

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

I exemplet ovan har vi skapat en klass med namnet Mönster. Klassen innehåller en metod display()som är överbelastad.

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

Här är huvudfunktionen för display()att skriva ut mönstret. Baserat på de givna argumenten utför metoden dock olika operationer:

  • skriver ut ett mönster av *, om inget argument skickas eller
  • skriver ut mönstret för parametern om ett enda chartypargument skickas.

Obs : Metoden som anropas bestäms av kompilatorn. Därför är det också känt som sammanställningstidspolymorfism.

3. Java-operatörsöverbelastning

Vissa operatörer i Java beter sig annorlunda med olika operander. Till exempel,

  • + operatören är överbelastad för att utföra numeriska tillägg samt strängkompatering och
  • operatörer gillar &, |och !är överbelastade för logiska och bitvisa operationer.

Låt oss se hur vi kan uppnå polymorfism med operatörsöverbelastning.

Det +Operatören används för att lägga till två enheter. Men i Java +utför operatören två operationer.

1. När den +används med siffror (heltal och flytande siffror) utför den matematisk addition. Till exempel,

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

2. När vi använder +operatören med strängar kommer den att utföra strängsammankoppling (sammanfoga två strängar). Till exempel,

 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.

I exemplet ovan har vi skapat en objektvariabel pl av klassen ProgrammingLanguage. Här är pl en polymorf variabel. Det här är för att,

  • I uttalande pl = new ProgrammingLanguage()hänvisar du till objektet för klassen ProgrammingLanguage.
  • Och, i uttalande pl = new Java(), hänvisa till objektet för Java-klassen.

Detta är ett exempel på upcasting i Java.

Intressanta artiklar...