方法分派
来源:互联网 发布:淘宝韩版女装图片 编辑:程序博客网 时间:2024/05/23 00:05
可以从两方面划分:
静态分派及动态分派
单分派及多分派
静态分派及动态分派
静态分派:
先来看一段代码:
public
class
StaticDispatch {
public
void
sayHello(Human guy) {
System.out.println(
"hello, guy!"
);
}
public
void
sayHello(Man guy) {
System.out.println(
"hello, man!"
);
}
public
void
sayHello(Women guy) {
System.out.println(
"hello, women!"
);
}
public
static
void
main(String[] args) {
Human man =
new
Man();
Human women =
new
Women();
StaticDispatch sd =
new
StaticDispatch();
sd.sayHello(man);
sd.sayHello(women);
}
}
class
Human {}
class
Man
extends
Human {}
class
Women
extends
Human {}
hello, guy!
hello, guy!
上面代码如果把
public
void
sayHello(Human guy) {
System.out.println(
"hello, guy!"
);
}
sd.sayHello((Man)man);
sd.sayHello((Women)women);
我们把 Human称为变量的 静态类型, Man称为变量的 实际类型。变量的静态类型和动态类型在程序中都可以发生变化,如下:
静态类型变化:
sd.sayHello((Man)man);
sd.sayHello((Women)women);
实际类型变化:
Human man = new Man();
man = new Women();
而区别是变量的静态类型是在编译阶段就可知的,但是动态类型要在运行期才可以确定,编译器在编译的时候并不知道变量的实际类型是什么。现在回到代码中,由于方法的接受者已经确定是StaticDispatch的实例sd了,所以最终调用的是哪个重载版本也就取决于传入参数的类型了。实际上,虚拟机(应该说是编译器)在重载(注意:是重载overload,不是重写override)时是通过参数的静态类型来当判定依据的,而且静态类型在编译期就可知,所以编译器在编译阶段就可根据静态类型来判定究竟使用哪个重载版本。于是对于例子中的两个方法的调用都是以Human为参数的版本。
再看下面两段代码:
public
class
StaticDispatch {
public
void
sayHello(Human guy) {
System.out.println(
"hello, guy!"
);
}
public
void
sayHello(Man guy) {
System.out.println(
"hello, man!"
);
}
public
void
sayHello(Women guy) {
System.out.println(
"hello, women!"
);
}
public
static
void
main(String[] args) {
Man man =
new
Man();
Women women =
new
Women();
StaticDispatch sd =
new
StaticDispatch();
sd.sayHello(man);
sd.sayHello(women);
}
}
class
Human {}
class
Man
extends
Human {}
class
Women
extends
Human {}
hello, man!
hello, women!
public
class
StaticDispatch {
public
void
sayHello(Human guy) {
System.out.println(
"hello, guy!"
);
}
public
static
void
main(String[] args) {
Man man =
new
Man();
Women women =
new
Women();
StaticDispatch sd =
new
StaticDispatch();
sd.sayHello(man);
sd.sayHello(women);
}
}
class
Human {}
class
Man
extends
Human {}
class
Women
extends
Human {}
hello, guy!
hello, guy!
动态分派:
先看下面代码:
public
class
DynamicDispatch {
public
static
void
main(String[] args) {
Human man =
new
Man();
Human women =
new
Women();
man.sayHello();
women.sayHello();
man =
new
Women();
man.sayHello();
}
}
class
Human {
protected
void
sayHello(){
System.out.println(
"hello Human!"
);
};
}
class
Man
extends
Human {
@Override
protected
void
sayHello() {
System.out.println(
"hello man!"
);
}
}
class
Women
extends
Human {
@Override
protected
void
sayHello() {
System.out.println(
"hello women!"
);
}
}
hello man!
hello women!
hello women!
总结:
重载(overload)方法的调用根据静态类型来决定,即采用静态分派!
重写(override)方法的调用根据实际类型来决定,即采用动态分派!
单分派和多分派
直至jdk6为止(jdk6以后不知道,因为《深入理解JVM》是基于jdk6来说明的),动态分派都是单分派,静态分派都是多分派,所以有以下两个名词:
静态多分派和动态单分派
0 0
- 方法分派
- 方法分派
- JVM方法分派:静态多分派、动态单分派
- JAVA 方法分派
- java 方法分派笔记
- JVM方法分派
- Java中的方法分派
- JVM之方法调用-分派
- 分派
- 分派
- java方法调用中的单分派与多分派
- 一道java面试题-方法静态分派
- Java方法分派-重写与重载区别
- JVM 方法调用之动态分派
- JVM 方法调用之动态分派
- java中的方法调用-解析与分派
- java方法调用之单分派与多分派(二)
- JAVA虚拟机中的方法分派,内联,与解析
- curl命令详解
- day07-tomcat
- 类加载器
- Codeforces567F. Mausoleum(DP)
- php与MySQL
- 方法分派
- Codeforces Round #245 (Div. 1)D(最近点对)
- 最小代价树
- 综合简单聊天系统
- HEVC码率控制算法研究与HM相应代码分析(三)——算法及代码分析
- 虚拟机加载机制
- 强、弱、软、虚引用
- 动态规划01背包问题
- leetcode 097 —— Interleaving String