Polymorphism in Java with Examples in 2024- Great Learning

29 Min Read

What’s Polymorphism in Java?

Polymorphism in Java is the duty that performs a single motion in several methods.

So, languages that don’t help polymorphism are usually not ‘Object-Oriented Languages’, however ‘Object-Primarily based Languages’. Ada, for example, is one such language. Since Java helps polymorphism, it’s an Object-Oriented Language.

Polymorphism happens when there’s inheritance, i.e., many courses are associated.

Inheritance is a robust characteristic in Java. Java Inheritance lets one class purchase the properties and attributes of one other class. Polymorphism in Java permits us to make use of these inherited properties to carry out totally different duties. Thus, permitting us to realize the identical motion in many various methods.

What’s Polymorphism?

The derivation of the phrase Polymorphism is from two totally different Greek words- poly and morphs. “Poly” means quite a few, and “Morphs” means kinds. So, polymorphism means innumerable kinds. Polymorphism, due to this fact, is without doubt one of the most vital options of Object-Oriented Programming.

Should Be taught Core Java Matters

Actual-Life Examples of Polymorphism

A person can have totally different relationships with totally different individuals. A girl generally is a mom, a daughter, a sister, and a buddy, all on the similar time, i.e. she performs different behaviors in several conditions.

The human physique has totally different organs. Each organ has a distinct perform to carry out; the center is accountable for blood movement, the lungs for respiration, the mind for cognitive exercise, and the kidneys for excretion. So we’ve got a normal methodology perform that performs in a different way relying upon the organ of the physique. 

Polymorphism in Java Instance

A superclass named “Shapes” has a way referred to as “space()”. Subclasses of “Shapes” may be “Triangle”, “circle”, “Rectangle”, and so forth. Every subclass has its method of calculating space. Utilizing Inheritance and Polymorphism means, the subclasses can use the “space()” methodology to seek out the realm’s components for that form.

class Shapes {
  public void space() {
    System.out.println("The components for space of ");
  }
}
class Triangle extends Shapes {
  public void space() {
    System.out.println("Triangle is ½ * base * top ");
  }
}
class Circle extends Shapes {
  public void space() {
    System.out.println("Circle is 3.14 * radius * radius ");
  }
}
class Predominant {
  public static void major(String[] args) {
    Shapes myShape = new Shapes();  // Create a Shapes object
    Shapes myTriangle = new Triangle();  // Create a Triangle object
    Shapes myCircle = new Circle();  // Create a Circle object
    myShape.space();
    myTriangle.space();
    myShape.space();
    myCircle.space();
  }
}

Output:

The components for the realm of the Triangle is ½ * base * top
The components for the realm of the Circle is 3.14 * radius * radius

class Form {
    public void draw() {
        System.out.println("Drawing a form");
    }
}

class Circle extends Form {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

class Sq. extends Form {
    @Override
    public void draw() {
        System.out.println("Drawing a sq.");
    }
}

class Predominant {
    public static void major(String[] args) {
        Form s1 = new Circle();
        Form s2 = new Sq.();

        s1.draw(); // Output: "Drawing a circle"
        s2.draw(); // Output: "Drawing a sq."
    }
}

On this instance, we’ve got a base class Form with a single methodology draw() that prints “Drawing a form” to the console. We then create two subclasses, Circle and Sq., that override the draw() methodology to print “Drawing a circle” and “Drawing a sq.” respectively.

Within the major methodology, we create two cases of the Form class, s1 and s2, which are literally cases of the Circle and Sq. subclasses. After we name the draw() methodology on these objects, the right implementation known as primarily based on the precise sort of the thing, that is run-time polymorphism. This system will output: “Drawing a circle” and “Drawing a sq.”

On this instance, the draw() methodology is overridden within the subclasses, and this enables for this system to find out which methodology to make use of at runtime. This is named runtime polymorphism or dynamic polymorphism, As a result of at runtime the JVM determines the precise sort of the thing and calls the corresponding methodology.

Additionally Learn: OOPs ideas in Java

Kinds of Polymorphism

You’ll be able to carry out Polymorphism in Java by way of two totally different strategies:

  1. Methodology Overloading
  2. Methodology Overriding

What’s Methodology Overloading in Java?

Methodology overloading is the method that may create a number of strategies of the identical title in the identical class, and all of the strategies work in several methods. Methodology overloading happens when there’s a couple of methodology of the identical title within the class.

Instance of Methodology Overloading in Java

class Shapes {
  public void space() {
    System.out.println("Discover space ");
  }
public void space(int r) {
    System.out.println("Circle space = "+3.14*r*r);
  }

public void space(double b, double h) {
    System.out.println("Triangle space="+0.5*b*h);
  }
public void space(int l, int b) {
    System.out.println("Rectangle space="+l*b);
  }


}

class Predominant {
  public static void major(String[] args) {
    Shapes myShape = new Shapes();  // Create a Shapes object
    
    myShape.space();
    myShape.space(5);
    myShape.space(6.0,1.2);
    myShape.space(6,2);
    
  }
}

Output:

Discover space
Circle space = 78.5
Triangle space=3.60
Rectangle space=12

What’s Methodology Overriding in Java?

Methodology overriding is the method when the subclass or a baby class has the identical methodology as declared within the guardian class.

See also  From Learning to Leading: Guiding Graduates to Leadership

Instance of Methodology Overriding in Java

class Car{  
  //defining a way  
  void run(){System.out.println("Car is shifting");}  
}  
//Creating a baby class  
class Car2 extends Car{  
  //defining the identical methodology as within the guardian class  
  void run(){System.out.println("automotive is working safely");}  
  
  public static void major(String args[]){  
  Car2 obj = new Car2();//creating object  
  obj.run();//calling methodology  
  }  
}  

Output:

Automobile is working safely

Additionally, Polymorphism in Java may be categorized into two sorts, i.e:

  1. Static/Compile-Time Polymorphism
  2. Dynamic/Runtime Polymorphism

What’s Compile-Time Polymorphism in Java?

Compile Time Polymorphism In Java is often known as Static Polymorphism. Moreover, the decision to the strategy is resolved at compile-time. Compile-Time polymorphism is achieved via Methodology Overloading. Such a polymorphism can be achieved via Operator Overloading. Nonetheless, Java doesn’t help Operator Overloading.

Methodology Overloading is when a category has a number of strategies with the identical title, however the quantity, sorts, and order of parameters and the return sort of the strategies are totally different. Java permits the consumer freedom to make use of the identical title for numerous capabilities so long as it could distinguish between them by the kind and variety of parameters. Take a look at a number of the essential questions on run time polymorphism in java interview questions.

Instance of Compile-Time Polymorphism in Java

We are going to do addition in Java and perceive the idea of compile time polymorphism utilizing subtract() 

package deal staticPolymorphism; 
public class Addition 
{ 
void sum(int a, int b) 
{ 
int c = a+b; 
System.out.println(“ Addition of two numbers :” +c); } 
void sum(int a, int b, int e) 
{ 
int c = a+b+e; 
System.out.println(“ Addition of three numbers :” +c); } 
public static void major(String[] args) 
{ 
Addition obj = new Addition(); 
obj.sum ( 30,90); 
obj.sum(45, 80, 22); 
} 
}

The output of this system will likely be: 

Sum of two numbers: 120 

Sum of three numbers: 147 

On this program, the sum() methodology overloads with two sorts by way of totally different parameters. 

That is the fundamental idea of compile-time polymorphism in java the place we will carry out numerous operations through the use of a number of strategies having the identical title.

What’s Runtime Polymorphism in Java?

Runtime polymorphism in Java can be popularly generally known as Dynamic Binding or Dynamic Methodology Dispatch. On this course of, the decision to an overridden methodology is resolved dynamically at runtime fairly than at compile-time. You’ll be able to obtain Runtime polymorphism by way of Methodology Overriding.

Methodology Overriding is completed when a baby or a subclass has a way with the identical title, parameters, and return sort because the guardian or the superclass; then that perform overrides the perform within the superclass. In easier phrases, if the subclass offers its definition to a way already current within the superclass; then that perform within the base class is alleged to be overridden.

Additionally, it ought to be famous that runtime polymorphism can solely be achieved via capabilities and never knowledge members. 

Overriding is completed through the use of a reference variable of the superclass. The tactic to be referred to as is decided primarily based on the thing which is being referred to by the reference variable. That is often known as Upcasting.

Upcasting takes place when the Dad or mum class’s reference variable refers back to the object of the kid class. For instance:

class A{} 
class B extends A{}  
A a=new B(); //upcasting

Examples of Runtime Polymorphism in Java

Instance 1:

On this instance, we’re creating one superclass Animal and three subclasses, Herbivores, Carnivores, and Omnivores. Subclasses lengthen the superclass and override its eat() methodology. We are going to name the eat() methodology by the reference variable of Dad or mum class, i.e. Animal class. Because it refers back to the base class object and the bottom class methodology overrides the superclass methodology; the bottom class methodology is invoked at runtime. As Java Digital Machine or the JVM and never the compiler determines methodology invocation, it’s, due to this fact, runtime polymorphism.

class Animal{  
  void eat(){
System.out.println("Animals Eat");
}  
}  
class herbivores extends Animal{  
  void eat(){
System.out.println("Herbivores Eat Crops");
} 
  }
class omnivores extends Animal{  
  void eat(){
System.out.println("Omnivores Eat Crops and meat");
} 
  }
class carnivores extends Animal{  
  void eat(){
System.out.println("Carnivores Eat meat");
} 
  }
class major{
  public static void major(String args[]){ 
    Animal A = new Animal();
    Animal h = new herbivores(); //upcasting  
	Animal o = new omnivores(); //upcasting  
    Animal c = new carnivores(); //upcasting  
    A.eat();
    h.eat();
    o.eat();  
    c.eat();  
  
  }  
}  

Output:

Animals eat
Herbivores Eat Crops
Omnivores Eat Crops and meat
Carnivores eat meat

Instance 2:

On this instance, we’re creating one superclass Hillstations and three subclasses Manali, Mussoorie, Gulmarg. Subclasses lengthen the superclass and override its location() and famousfor() methodology. We are going to name the placement() and famousfor() methodology by the Dad or mum class’, i.e. Hillstations class. Because it refers back to the base class object and the bottom class methodology overrides the superclass methodology; the bottom class methodology is invoked at runtime. Additionally, as Java Digital Machine or the JVM and never the compiler determines methodology invocation, it’s runtime polymorphism.

class Hillstations{  
  void location(){
System.out.println("Location is:");
}  
void famousfor(){
System.out.println("Well-known for:");
}  

}  
class Manali extends Hillstations {  
  void location(){
System.out.println("Manali is in Himachal Pradesh");
}  
void famousfor(){
System.out.println("It's Well-known for Hadimba Temple and journey sports activities");
}  
  }
class Mussoorie extends Hillstations {  
  void location(){
System.out.println("Mussoorie is in Uttarakhand");
}  
void famousfor(){
System.out.println("It's Well-known for schooling establishments");
}  
  }
class Gulmarg extends Hillstations {  
  void location(){
System.out.println("Gulmarg is in J&Ok");
}  
void famousfor(){
System.out.println("It's Well-known for snowboarding");
}  
  }
class major{
  public static void major(String args[]){ 
    Hillstations A = new Hillstations();
    Hillstations M = new Manali();

    Hillstations Mu = new Mussoorie();

    Hillstations G = new Gulmarg();

    A.location();
A.famousfor();

M.location();
M.famousfor();

Mu.location();
Mu.famousfor();

G.location();
G.famousfor();
  }  
}  

Output:

Location is:
Well-known for:
Manali is in Himachal Pradesh
It’s Well-known for Hadimba Temple and journey sports activities
Mussoorie is in Uttarakhand
It’s Well-known for schooling establishments
Gulmarg is in J&Ok
It’s Well-known for snowboarding

See also  Depth Anything by TikTok: A Technical Exploration

Instance of run-time polymorphism in java

We are going to create two courses Automobile and Innova, Innova class will lengthen the automotive class and can override its run() methodology.

class Automobile 
{ 
void run() 
{ 
System.out.println(“ working”); 
} 
}
class innova extends Automobile 
{ 
void run(); 
{ 
System.out.println(“ working quick at 120km”); 
} 
public static void major(String args[]) 
{ 
Automobile c = new innova(); 
c.run(); 
} 
} 

The output of the next program will likely be; 

Operating quick at 120 km. 

One other instance for run-time polymorphism in Java

Now, allow us to test if we will obtain runtime polymorphism by way of knowledge members. 

class automotive 
{ 
int speedlimit = 125; 
} 
class innova extends automotive 
{ 
int speedlimit = 135; 
public static void major(String args[]) 
{ 
automotive obj = new innova(); 
System.out.println(obj.speedlimit);
}

The output of the next program will likely be : 

125 

This clearly implies we will’t obtain Runtime polymorphism by way of knowledge members. In brief, a way is overridden, not the info members.

Runtime polymorphism with multilevel inheritance

class grandfather 
{ 
void swim() 
{ 
System.out.println(“ Swimming”); 
} 
} 
class father extends grandfather 
{ 
void swim() 
{ 
System.out.println(“ Swimming in river”); 
} 
} 
class son extends father 
{ 
void swim() 
{ 
System.out.println(“ Swimming in pool”);
} 
public static void major(String args[]) 
{ 
grandfather f1,f2,f3; 
f1 =new grandfather(); 
f2 = new father(); 
f3 = new son(); 
f1.swim(); 
f2.swim(); 
f3.swim(): 
} 
} 

The output of the next program will likely be: 

Swimming, Swimming in river, Swimming in pool

One other runtime polymorphism with multilevel inheritance instance

class soundAnimal 
{ 
public void Sound() 
{ 
System.out.println("Completely different sounds of animal"); }
} 
class buffalo extends soundAnimal 
{ 
public void Sound() 
{ 
System.out.println("The buffalo sound- gho,gho"); } 
} 
class snake extends soundAnimal 
{ 
public void Sound() 
{ 
System.out.println("The snake sound- his,his"); } 
} 
class tiger extends soundAnimal
{ 
public void Sound() 
{ 
System.out.println("The tiger sounds- roooo, rooo"); } 
} 
public class Animal Predominant 
{ 
public static void major(String[] args) 
{ 
soundAnimal Animal = new soundAnimal(); soundAnimal buffalo = new buffalo(); 
soundAnimal snake = new snake(); 
soundAnimal tiger = new tiger(); 
Animal.Sound(); 
buffalo.Sound();
snake.Sound(); 
tiger.Sound(); 
} 
} 

The output of the next program will likely be; 

The buffalo sound- gho,gho 

The snake sound- his,his 

The tiger sound- roooo,roooo 

We hope you bought an concept about runtime and compile-time polymorphism.

Polymorphic Subtypes

Subtype principally implies that a subtype can function one other sort’s subtype, sounds a bit sophisticated? 

Let’s perceive this with the assistance of an instance:

Assuming we’ve got to attract some arbitrary shapes, we will introduce a category named ‘form’ with a draw() methodology. By overriding draw() with different subclasses reminiscent of circle, sq., rectangle, trapezium, and so forth we’ll introduce an array of sort ‘form’ whose parts retailer references will check with ‘form’ subclass references. Subsequent time, we’ll name draw(), all shapes cases draw () methodology will likely be referred to as.

This Subtype polymorphism typically depends on upcasting and late binding. A casting the place you forged up the inheritance hierarchy from subtype to a supertype is termed upcasting.

To name non-final occasion strategies we use late binding. In brief, a compiler shouldn’t carry out any argument checks, sort checks, methodology calls, and so forth, and depart every part on the runtime. 

What’s Polymorphism in Programming?

Polymorphism in programming is outlined utilization of a single image to characterize a number of differing types.

What’s Polymorphism Variables?

A polymorphic variable is outlined as a variable that may maintain values of various sorts through the course of execution.

Why use Polymorphism in Java?

Polymorphism in Java makes it attainable to jot down a way that may accurately course of numerous several types of functionalities which have the identical title. We will additionally acquire consistency in our code through the use of polymorphism.

Benefits of Polymorphism in Java

  1. It offers reusability to the code. The courses which are written, examined and applied may be reused a number of occasions. Moreover, it saves plenty of time for the coder. Additionally, the one can change the code with out affecting the unique code.
  2. A single variable can be utilized to retailer a number of knowledge values. The worth of a variable you inherit from the superclass into the subclass may be modified with out altering that variable’s worth within the superclass; or some other subclasses.
  3. With lesser strains of code, it turns into simpler for the programmer to debug the code.

Traits of Polymorphism

Polymorphism has many different traits aside from Methodology Overloading and Methodology Overriding. They embody:

  • Coercion
  • Inside Operator Overloading
  • Polymorphic Variables or Parameters

1. Coercion

Coercion offers with implicitly changing one sort of object into a brand new object of a distinct form. Additionally, that is performed routinely to stop sort errors within the code. 

Programming languages reminiscent of C, java, and so forth help the conversion of worth from one knowledge sort to a different knowledge sort. Knowledge sort conversions are of two sorts, i.e., implicit and specific. 

Implicit sort conversion is routinely performed in this system and any such conversion can be termed coercion. 

For instance, if an operand is an integer and one other one is in float, the compiler implicitly converts the integer into float worth to keep away from sort error.

Instance:

class coercion {

  public static void major(String[] args) {
    Double space = 3.14*5*7;
System.out.println(space);
String s = "completely satisfied";
int x=5;
String phrase = s+x;
System.out.println(phrase);

  }
}

Output:

109.9
happy5

2. Inside Operator Overloading

In Operator Overloading, an operator or image behaves in additional methods than one relying upon the enter context or the kind of operands. It’s a attribute of static polymorphism. Though Java doesn’t help user-defined operator overloading like C++, the place the consumer can outline how an operator works for various operands, there are few cases the place Java internally overloads operators.

See also  2023 was a great year for open-source LLMs

Operator overloading is the idea of utilizing the operator as per your alternative. Subsequently, an operator image or methodology title can be utilized as a ‘user-defined’ sort as per the necessities. 

For instance, ‘+’ can be utilized to carry out the addition of numbers (similar knowledge sort) or for concatenation of two or extra strings.

Within the case of +, can be utilized for addition and in addition for concatenation.

For instance:

class coercion {

  public static void major(String[] args) {
    
String s = "completely satisfied";
String s1 = "world";
int x=5;
int y=10;

System.out.println(s+s1);
System.out.println(x+y);

  }
}

Output :

Equally, operators like! &, and | are additionally within the overload place for logical and bitwise operations. In each of those circumstances, the kind of argument will determine how the operator will interpret.

 3. Polymorphic Variables or Parameters

In Java, the thing or occasion variables characterize the polymorphic variables. It is because any object variables of a category can have an IS-A relationship with their very own courses and subclasses.

The Polymorphic Variable is a variable that may maintain values of various sorts through the time of execution.

Parametric polymorphism specifies that whereas class declaration, a area title can affiliate with differing types, and a way title can affiliate with totally different parameters and return sorts.

For instance:

class Form
{
public void show()
{
System.out.println("A Form.");
}
}
class Triangle extends Form
{
public void show()
{
System.out.println("I'm a triangle.");
}
}
class Predominant{
public static void major(String[] args)
{
Form obj;
obj = new Form();
obj.show();
obj = new Triangle();
obj.show();
}
}

Output:

A Form.
I’m a triangle.

Right here, the obj object is a polymorphic variable. It is because the superclass’s similar object refers back to the guardian class (Form) and the kid class (Triangle). 

Issues with Polymorphism 

With numerous benefits, there are additionally a couple of disadvantages of polymorphism.

  • Polymorphism is sort of difficult whereas implementation.
  • It tends to cut back the readability of the code.
  • It raises some severe efficiency points in real-time as effectively.

Sort Identification Throughout Downcasting 

Downcasting is termed as casting to a baby sort or casting a standard sort to a person sort.

So, we use downcasting every time we have to entry or perceive the behaviour of the subtypes. 

Instance, 

This can be a hierarchical instance 

Meals> Vegetable> Ladyfinger, Tomato 

Right here, tomato and ladyfinger are two subclasses. 

In downcasting, we slim the kind of objects, which implies we’re changing widespread sort to particular person sort. 

Vegetable vegetable = new Tomato(); 

Tomato castedTomato = (Tomato) vegetable; 

Right here we’re casting widespread sort to a person sort, superclass to subclass which isn’t attainable straight in java.

We explicitly inform the compiler what the runtime sort of the thing is.

Fragile base class drawback 

Fragile base class drawback is nothing however a basic architectural drawback. 

Typically the improper design of a guardian class can lead a subclass of a superclass to make use of superclass in some unpredicted methods. 

The fragility of inheritance will result in damaged codes even when all the standards is met. 

This architectural drawback is termed as a fragile base class drawback in object-oriented programming programs and language. 

Mainly, the explanation for the delicate base drawback is that the developer of the bottom class has no concept of the subclass design. There isn’t any resolution but for this drawback. 

Conclusion

We hope you have to have gotten a primary concept of polymorphism in Java and the way we use it in addition to issues associated to them. 

Therefore, this brings us to the tip of the weblog on Polymorphism in Java. Moreover, to study extra about programming and different associated ideas, try the programs on Nice Studying Academy and PG Packages in Software program Engineering.  

Additionally, if you’re getting ready for Interviews, try these Interview Questions for Java to ace it like a professional.

So, don’t cease your journey of studying. Additionally, don’t overlook to upskill and reskill your self. Hold exploring and continue to learn.

Often Requested Questions

What’s polymorphism with instance?

One of many OOPs options that enables us to hold out a single motion in numerous methods is named polymorphism in Java. For instance, we’ve got a category Animal with a way sound(). This can be a generic class and so we can not give it an implementation reminiscent of: Meow, Oink, Roar, and so forth. 

What are the 4 forms of polymorphism?

The 4 forms of polymorphism are:
– Runtime or Subtype polymorphism
– Overloading or Parametric polymorphism
– Compile-time or Advert hoc polymorphism
– Casting or Coercion polymorphism

What’s polymorphism in OOPs?

One of many core ideas of OOP or object-oriented programming, polymorphism describes conditions during which a particualr factor happens in several kinds. In laptop science, polymorphism describes an idea that enables us to entry several types of objects via the identical interface.

What’s overriding in OOP?

In object-oriented programming, overriding is a characteristic that enables a subclass or little one class to supply a particular implementation of a way that’s already supplied by certainly one of its superclasses or guardian courses.

What’s overriding vs overloading?

If two or extra strategies in the identical class have the identical title, however have totally different parameters, this is named Overloading. In case of Overriding, a way signature (title and parameters) are present in the identical superclass and the kid class.

Partaking within the examine of Java programming suggests a eager curiosity within the realm of software program improvement. For these embarking upon this journey with aspirations in direction of a profession on this area, it’s endorsed to discover the next pages with the intention to purchase a complete understanding of the event profession path:

Source link

Share This Article
Leave a comment

Leave a Reply

Your email address will not be published. Required fields are marked *

Please enter CoinGecko Free Api Key to get this plugin works.