Java Programming
Topperworld.in
Polymorphism in Java
Polymorphism is an important concept of object-oriented programming.
It simply means more than one form.
That is, the same entity (method or operator or object) can perform
different operations in different scenarios.
Let us understand the definition of polymorphism by an example; a lady can
have different characteristics simultaneously. She can be a mother, a
daughter, or a wife, so the same lady possesses different behavior in
different situations.
Example: 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...");
Java Programming
}
}
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();
}
}
Output
Rendering Square...
Rendering Circle...
In the above example,
we have created a superclass: Polygon and two subclasses: Square and
Circle. Notice the use of the render() method.
The main purpose of the render() method is to render the shape. However,
the process of rendering a square is different than the process of rendering
a circle.
Hence, the render() method behaves differently in different classes.
Types of Polymorphism
Compile-time polymorphism
Run-time polymorphism
Java Programming
Compile-time Polymorphism :
Compile-time polymorphism in Java is
also called static polymorphism or static method dispatch. It can be
achieved by method overloading. In this process, an overloaded method is
resolved at compile time rather than resolving at runtime.
Java Method Overloading
In a Java class, we can create methods with the same name if they differ
in parameters. For example,
void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }
This is known as method overloading in Java. Here, the same method will
perform different operations based on the parameter.
Example : Polymorphism using method overloading
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) {
Java Programming
Pattern d1 = new Pattern();
// call method without any argument
d1.display();
System.out.println("\n");
// call method with a single argument
d1.display('#');
}
}
Output:
**********
##########
In the above example, we have created a class named Pattern. The class
contains a method named display() that is overloaded.
// method with no arguments
display() {...}
// method with a single char type argument
display(char symbol) {...}
Here, the main function of display() is to print the pattern. However,
based on the arguments passed, the method is performing different
operations:
prints a pattern of *, if no argument is passed or
prints pattern of the parameter, if a single char type argument is
passed.
Java Programming
Run-time Polymorphism :
Run-time polymorphism in Java is also
called Dynamic method dispatch. It can be achieved by method overriding.
In this process, Instead of resolving the overridden method at compile-
time, it is resolved at runtime.
Java Method Overriding
If the same method is present in both the superclass and the subclass.
Then, the method in the subclass overrides the same method in the
superclass. This is called method overriding.
In this case, the same method will perform one operation in the superclass
and another operation in the subclass. For example,
Example : Polymorphism using method overriding
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();
Java Programming
}
}
Output:
Java Programming Language
Common English Language
In the above example,
we have created a superclass named Language and a subclass
named Java.
Here, the method displayInfo() is present in both Language and Java.
The use of displayInfo() is to print the information. However, it is printing
different information in Language and Java.
Characteristics of Polymorphism :
Overloading: Polymorphism in Java is achieved through method
overloading, which allows multiple methods to have the same name
but different parameters or argument types. The Java compiler
determines which method to call based on the arguments provided
at compile time.
Overriding: Polymorphism in Java is also achieved through method
overriding, where a subclass provides a different implementation of
a method that is already defined in its parent class. The subclass
method must have the same name and signature as the parent class
method. When the method is called on an object of the subclass, the
subclass method is executed instead of the parent class method.
Java Programming
Dynamic binding: Polymorphism in Java also involves dynamic
binding, where the actual implementation of a method is determined
at runtime instead of compile time. This allows for more flexible and
adaptable code as objects can be manipulated and used in different
ways.
Flexibility: Polymorphism in Java allows objects of different classes
to be treated as if they were of the same class, making the code more
flexible and reusable.
Extensibility: Polymorphism in Java allows for more modular and
extensible code as it enables objects to be manipulated and used in
different ways, making it easier to add new functionality or modify
existing code.
Abstraction: Polymorphism in Java is closely related to abstraction,
as it allows objects to be abstracted into a common interface or
superclass, allowing for more generic code that can handle different
types of objects.