Java Language
Отправка динамического метода
Поиск…
Вступление
Что такое диспетчер динамического метода?
Dynamic Method Dispatch - это процесс, в котором вызов переопределенного метода разрешается во время выполнения, а не во время компиляции. Когда переопределенный метод вызывается ссылкой, Java определяет, какая версия этого метода должна выполняться в зависимости от типа объекта, к которому он относится. Это также известно как полиморфизм времени выполнения.
Мы увидим это на примере.
замечания
- Динамическое связывание = Поздняя привязка
- Абстрактные классы не могут быть созданы, но они могут быть подклассифицированы (Base для дочернего класса)
- Абстрактным методом является метод, объявленный без реализации
- Абстрактный класс может содержать сочетание методов, объявленных с реализацией или без нее
- Когда абстрактный класс подклассифицирован, подкласс обычно предоставляет реализации для всех абстрактных методов в его родительском классе. Однако, если это не так, то подкласс также должен быть объявлен абстрактным
- Рассылка динамического метода - это механизм, с помощью которого вызов переопределенного метода разрешается во время выполнения. Так Java реализует полиморфизм времени выполнения.
- Upcasting: переход подтипа к супертипу, вверх к дереву наследования.
- Полиморфизм времени выполнения = динамический полиморфизм
Отправка динамического метода - пример кода
Аннотация Класс:
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");
}
}
Переопределение абстрактного метода в классе детей:
import base.ClsVirusScanner;
//All the 3 child classes inherits the base class ClsVirusScanner
//Child Class 1
class 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 3
class ClsFreeVersion extends ClsVirusScanner{
@Override
public void fnStartScan() {
super.fnVirusMalwareScan();
}
}; //ClsTrialVersion IS-A ClsVirusScanner
Динамическое / позднее связывание приводит к отправке динамического метода:
//Calling Class
public 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();
}
}
Результат:
Scan for Internet Security
Detect Virus & Malware
Ускорение:
objVS = new ClsFreeVersion();
objVS = new ClsPaidVersion();
objVS = new ClsTrialVersion()
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow