Skip to main content

Dynamic Dispatch

The process of assigning subclass object to superclass reference variable is called as dynamic dispatch.

Which of the following are valid?​

A ob=new A();// Valid
A ob=new B();// Valid
A ob=new D();// Valid
B ob=new B();// Valid
B ob=new A();// Invalid
B ob=new C();// Invalid
B ob=new D();// Valid
D ob=new A();// Invalid
A ob=new E();// Valid

3.10 Polymorphism

  • Polymorphism (One name - Many forms).
  • Polymorphism is the ability of an object to behave differently at different situations.

Types of Polymorphism​

  1. Static Polymorphism
  2. Dynamic Polymorphism

1) Static Polymorphism

Static polymorphism can be achieved using method overloading.

  • It can be achieved with both instance and static methods.
  • Static Polymorphism is also called as compile time polymorphism or early binding because Java compiler is responsible to bind the method calls with actual method at compile time.
  • Java compiler will verify the method name first then method parameters to verify the matching method.
  • Return type will not be considered.
class Arithmetic{
void sum(double d){ ... }

void sum(int a,boolean b){ ... }
}
Arithmetic ar=new Arithmetic();

1.ar.sum(10);
2.ar.sum(10,20);
3.ar.sum(10.0);

Case 1 : ar.sum10()

Compiler will do the following tasks:​

  • sum10() method will be verified in the class.
  • sum10() method is not available, so compile time error will be given.

Case 2 : ar.sum(10, 20)

Compiler will do the following tasks:​

  • sum() method will be verified in the class.
  • sum() method is available.
  • Now method parameters will be verified.
  • Method with given parameters is not available. So compile time error will be given.

Case 3 : ar.sum(10.0);

Compiler will do the following tasks:​

  • sum() method will be verified in the class.
  • sum() method is available.
  • Now method parameters will be verified.
  • Method with given parameters is available.
  • Compiler will bind this method call to actual matched method and it will go to next line.

2) Dynamic Polymorphism

  • Dynamic Polymorphism can be achieved using both method overriding and dynamic dispatch.
  • It is also called as runtime polymorphism or late binding because JVM is responsible to decide which method will be invoked based on actual object available in reference variable.
  • It can be achieved only with instance method, can't be achieved using static method.

Person.java​

class Person {

void eating() {
System.out.println("Person -> eating()");
}

void walking() {
System.out.println("Person -> walking()");
}

static void sleeping() {
System.out.println("Person -> sleeping()");
}
}

Employee.java​

class Employee extends Person {

void walking() {
System.out.println("Employee -> walking()");
}

static void sleeping() {
System.out.println("Employee -> sleeping()");
}

void working() {
System.out.println("Employee -> working()");
}
}

Student.java​

class Student extends Person {

void walking() {
System.out.println("Student -> walking()");
}

static void sleeping() {
System.out.println("Student -> sleeping()");
}

void reading() {
System.out.println("Student -> reading()");
}
}

Lab518.java​

class Lab518 {

public static void main(String args[]) {
Person pob = null;

pob = new Student();
pob.eating();

pob = new Employee();
pob.eating();
}
}

Lab519.java​

class Lab519 {

public static void main(String args[]) {
Person pob = null;

pob = new Student();
pob.walking();

pob = new Employee();
pob.walking();
}
}

Lab520.java​

class Lab520 {

public static void main(String args[]) {
Person pob = null;

pob = new Student();
pob.sleeping();

pob = new Employee();
pob.sleeping();
}
}

Lab521.java​

class Lab521 {

public static void main(String args[]) {
Person pob = null;

pob = new Student();
pob.reading();

pob = new Employee();
pob.working();
}
}

Lab522.java​

class Lab522 {

public static void main(String args[]) {
Person pob = null;

pob = new Student();

Student stu = (Student) pob;
stu.reading();

pob = new Employee();

Employee emp = (Employee) pob;
emp.working();
}
}

Lab523.java​

class Lab523 {

public static void main(String args[]) {
A aobj = new B();

System.out.println(aobj.x);
}
}

class A {

int x = 10;
}

class B extends A {

String x = "JavaWorld";
}

Output​

10

Lab524.java​

class Lab524 {

public static void main(String args[]) {
A aobj = new B();

aobj.x = 99;

System.out.println(aobj.x);
}
}

class A {

int x = 10;
}

class B extends A {

String x = "JavaWorld";
}

Output​

99

Lab525.java​

class Lab525 {

public static void main(String args[]) {
B bobj = new B();
bobj.show();
}
}

class A {

int x = 10;
}

class B extends A {

String x = "JavaWorld";

void show() {
System.out.println(x);
System.out.println(super.x);
}
}

Output​

JavaWorld
10

Lab526.java​

class Lab526 {

public static void main(String args[]) {
B bobj = new B();
bobj.show();
}
}

class A {

int x = 10;
}

class B extends A {

String x = "JavaWorld";

void show() {
B ref1 = this;
A ref2 = this;

System.out.println(ref1.x + "\t" + ref2.x);
}
}

Output​

JavaWorld 10

Lab527.java​

class Lab527 {

public static void main(String args[]) {
B bobj = new B();

bobj.x = "SRI";

A aobj = bobj;
aobj.x = 88;

bobj.show();
}
}

class A {

int x = 10;
}

class B extends A {

String x = "JavaWorld";

void show() {
System.out.println(x);
System.out.println(super.x);
}
}

Output​

SRI
88