Dynamic Method Dispatch
What is Dynamic Method Dispatch?
Dynamic Method Dispatch is a process in which the call to an overridden method is resolved at runtime rather than at compile-time. When an overridden method is called by a reference, Java determines which version of that method to execute based on the type of object it refer to. This is also know as runtime polymorphism.
We will see this through an example.
Dynamic Method Dispatch - Example Code
Section titled “Dynamic Method Dispatch - Example Code”Abstract Class :
package base;
/*Abstract classes cannot be instantiated, but they can be subclassed*/public abstract class ClsVirusScanner {
//With One Abstract method public abstract void fnStartScan();
protected void fnCheckForUpdateVersion(){ System.out.println("Perform Virus Scanner Version Check"); }
protected void fnBootTimeScan(){ System.out.println("Perform BootTime Scan"); } protected void fnInternetSecutiry(){ System.out.println("Scan for Internet Security"); }
protected void fnRealTimeScan(){ System.out.println("Perform RealTime Scan"); }
protected void fnVirusMalwareScan(){ System.out.println("Detect Virus & Malware"); }}Overriding Abstract Method in Child Class :
import base.ClsVirusScanner;
//All the 3 child classes inherits the base class ClsVirusScanner//Child Class 1class ClsPaidVersion extends ClsVirusScanner{ @Override public void fnStartScan() { super.fnCheckForUpdateVersion(); super.fnBootTimeScan(); super.fnInternetSecutiry(); super.fnRealTimeScan(); super.fnVirusMalwareScan(); }}; //ClsPaidVersion IS-A ClsVirusScanner//Child Class 2
class ClsTrialVersion extends ClsVirusScanner{ @Override public void fnStartScan() { super.fnInternetSecutiry(); super.fnVirusMalwareScan(); }}; //ClsTrialVersion IS-A ClsVirusScanner
//Child Class 3class ClsFreeVersion extends ClsVirusScanner{ @Override public void fnStartScan() { super.fnVirusMalwareScan(); }}; //ClsTrialVersion IS-A ClsVirusScannerDynamic/Late Binding leads to Dynamic method dispatch :
//Calling Classpublic class ClsRunTheApplication {
public static void main(String[] args) {
final String VIRUS_SCANNER_VERSION = "TRIAL_VERSION";
//Parent Refers Null ClsVirusScanner objVS=null;
//String Cases Supported from Java SE 7 switch (VIRUS_SCANNER_VERSION){ case "FREE_VERSION":
//Parent Refers Child Object 3 //ClsFreeVersion IS-A ClsVirusScanner objVS = new ClsFreeVersion(); //Dynamic or Runtime Binding break; case "PAID_VERSION":
//Parent Refers Child Object 1 //ClsPaidVersion IS-A ClsVirusScanner objVS = new ClsPaidVersion(); //Dynamic or Runtime Binding break; case "TRIAL_VERSION":
//Parent Refers Child Object 2 objVS = new ClsTrialVersion(); //Dynamic or Runtime Binding break; }
//Method fnStartScan() is the Version of ClsTrialVersion() objVS.fnStartScan();
}}Result :
Scan for Internet SecurityDetect Virus & MalwareUpcasting :
objVS = new ClsFreeVersion();objVS = new ClsPaidVersion();objVS = new ClsTrialVersion()Remarks
Section titled “Remarks”- Dynamic Binding = Late binding
- Abstract classes cannot be instantiated, but they can be sub-classed (Base for a child class)
- An abstract method is a method that is declared without an implementation
- Abstract class may contain a mix of methods declared with or without an implementation
- When an abstract class is sub-classed, the subclass usually provides implementations for all of the abstract methods in its parent class. However, if it does not, then the subclass must also be declared abstract
- Dynamic method dispatch is a mechanism by which a call to an overridden method is resolved at runtime. This is how java implements runtime polymorphism.
- Upcasting : Casting a subtype to a supertype, upward to the inheritance tree.
- Runtime Polymorphism = Dynamic Polymorphism