In this tutorial, I’ll explain about Polymorphism in Java. It is one of the four concepts of OOPs. It is a concept where we can perform a single action in multiple ways. Poly means many and morphs means form. Polymorphism allows us to define one interface and have multiple implementations. An example of polymorphism is that there are different forms of communication like call, sms, picture messages, etc.
There are 2 types of polymorphism:-
- Method Overloading in Java – This is an example of compile time (or static polymorphism)
- Method Overriding in Java – This is an example of runtime time (or dynamic polymorphism)
Complie Time Polymorphism
It is also known as static polymorphism. Method Overloading is an example of static polymorphism. It is a feature that allows a class to have more than one method having the same name, if their argument lists are different. Error if any occur, resolved during compile time.
Below is an example of static polymorphism.
public class Calculation {
void sum(int a, int b) {
System.out.println("Sum of 2 numbers :" + (a + b));
}
void sum(int x, int y, int z) {
System.out.println("Sum of 3 numbers :" + (x + y + z));
}
}
public class PolymorphismTest {
public static void main(String[] args) {
Calculation cal = new Calculation();
cal.sum(10, 5);
cal.sum(2, 6, 4);
}
}
Output
Sum of 2 numbers :15
Sum of 3 numbers :12
Dynamic Polymorphism
It is also known as Dynamic Method Dispatch. In this call to overridden method happens at the runtime. This type of polymorphism is achieved by Method Overriding. Declaring a method in sub class which is already present in parent class is known as method overriding.
Below is an example of dynamic polymorphism
Parent Class
public class Bank {
//Overridden method
public void getRateOfInterest() {
System.out.println("getRateOfInterest() method of parent class");
System.out.println("Interest Rate of Bank :" + 0);
}
}
Child 1 Class
public class BOI extends Bank {
// Overriding method
public void getRateOfInterest() {
System.out.println("getRateOfInterest() method of child 1 class");
System.out.println("Interest Rate of BOI Bank :" + 4.1);
}
}
Child 2 Class
public class BofA extends Bank {
// Overriding method
public void getRateOfInterest() {
System.out.println("getRateOfInterest() method of child 2 class");
System.out.println("Interest Rate of BofA Bank :" + 3.2);
}
}
Child 3 Class
public class SBI extends Bank {
// Overriding method
public void getRateOfInterest() {
System.out.println("getRateOfInterest() method of child 3 class");
System.out.println("Interest Rate of SBI Bank :" + 5.3);
}
}
Test Class
public class StaticPolTest {
public static void main(String[] args) {
Bank bank1 = new Bank();
bank1.getRateOfInterest();
BOI bank2 = new BOI();
bank2.getRateOfInterest();
BofA bank3 = new BofA();
bank3.getRateOfInterest();
SBI bank4 = new SBI();
bank4.getRateOfInterest();
}
}
Output
getRateOfInterest() method of parent class
Interest Rate of Bank :0
getRateOfInterest() method of child 1 class
Interest Rate of BOI Bank :4.1
getRateOfInterest() method of child 2 class
Interest Rate of BofA Bank :3.2
getRateOfInterest() method of child 3 class
Interest Rate of SBI Bank :5.3
Points to note for Method Overriding:-
- The argument list of overriding method (method of subclass) must match the Overridden method(the method of parent class). The data types of the arguments and their sequence should exactly match.
- Access Modifier of the overriding method (method of subclass) cannot be more restrictive than the overridden method of parent class.
Suppose, I have changed the access modifier of SBI class from public to protected and then run the StaticPolTest program. In that case, I’ll get a compile time error.
getRateOfInterest() method of parent class
Interest Rate of Bank :0
getRateOfInterest() method of child 1 class
Interest Rate of BOI Bank :4.1
getRateOfInterest() method of child 2 class
Interest Rate of BofA Bank :3.2
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot reduce the visibility of the inherited method from Bank
at JavaDemo.Polymorphism.SBI.getRateOfInterest(SBI.java:6)
at JavaDemo.Polymorphism.StaticPolTest.main(StaticPolTest.java:17)