Saturday 23 March 2013

Dynamic Method Dispatch


Dynamic method dispatch is the mechanism by which a call to an overridden method
is resolved at run time, rather than compile time. Dynamic method dispatch is
important because this is how Java implements run-time polymorphism.
Let’s begin by restating an important principle: a superclass reference variable can
refer to a subclass object. Java uses this fact to resolve calls to overridden methods at
run time. Here is how. When an overridden method is called through a superclass
reference, Java determines which version of that method to execute based upon the
type of the object being referred to at the time the call occurs. Thus, this determination
is made at run time. When different types of objects are referred to, different versions
of an overridden method will be called. In other words, it is the type of the object being
referred to (not the type of the reference variable) that determines which version of an
overridden method will be executed. Therefore, if a superclass contains a method that
is overridden by a subclass, then when different types of objects are referred to through
a superclass reference variable, different versions of the method are executed.
Here is an example that illustrates dynamic method dispatch:
// Dynamic Method Dispatch
class A {
void callme() {
System.out.println("Inside A's callme method");
}
}
class B extends A {
// override callme()
void callme() {
System.out.println("Inside B's callme method");
}
}
class C extends A {
// override callme()
void callme() {
System.out.println("Inside C's callme method");
}
}
class Dispatch {
public static void main(String args[]) {
A a = new A(); // object of type A
B b = new B(); // object of type B
C c = new C(); // object of type C
A r; // obtain a reference of type A
r = a; // r refers to an A object
r.callme(); // calls A's version of callme
r = b; // r refers to a B object
r.callme(); // calls B's version of callme
r = c; // r refers to a C object
r.callme(); // calls C's version of callme
}
}

The output from the program is shown here:

Inside A’s callme method
Inside B’s callme method
Inside C’s callme method
This program creates one superclass called A and two subclasses of it, called B
and C. Subclasses B and C override callme( ) declared in A. Inside the main( ) method,
objects of type A, B, and C are declared. Also, a reference of type A, called r, is declared.
The program then assigns a reference to each type of object to r and uses that reference to
invoke callme( ). As the output shows, the version of callme( ) executed is determined by
the type of object being referred to at the time of the call. Had it been determined by the
type of the reference variable, r, you would see three calls to A’s callme( ) method.

No comments:

Post a Comment