[/code]Java 语言的静态多分派和动态单分派特性。
先来熟悉概念:
静态多分派:
静态分派 意思是 所有依赖静态类型来定位方法执行版本的分派过程就叫做静态分派,静态分派最典型的应用就是方法重载。
动态单分派:
动态单分派 意思是 根据运行期实际类型确定方法执行版本的分派过程叫做动态分派,动态分派最典型的应用就是方法重写。
再来看看单分派和多分派
单分派: 就是说 依据只有一个
多分派:就是说 依据可以有多个
那Java里面的静态多分派 意思就是,依赖静态类型来确定方法执行版本的时候,可以依据多个证据。
举个例子:
[code="java"]
public class Loder {
public static void fu(char a){
System.out.println("char");
}
public static void fu(int a){
System.out.println("int");
}
public static void fu(long a){
System.out.println("long");
}
public static void fu(float a){
System.out.println("float");
}
public static void fu(double a){
System.out.println("double");
}
public static void main(String[] args) {
fu('a');
}
public static void fu(Character a){
System.out.println("Character ");
}
public static void fu(char ... a){
System.out.println("...");
}
public static void fu(Sezrizable a){
System.out.println("Sezrizable ");
}
public static void fu(Object a){
System.out.println("Object ");
}
}
上面这段代码 输出的时候 如果存在char 参数,就输出char,如果不存在char参数,就先转为int 输出int,以此类推,会以此输出 long float double,Character , Sezrizable ,Object , ...
可以看出 多参数的优先级最低,输出 Sezrizable 是因为 其类型实现了 Sezrizable 接口
静态方法是在类加载期就进行编译,方法执行版本的选择也是静态分派进行的。依据也不是唯一的。
动态单分派 简单点就是 运行时根据确切的类型来确定执行方法的版本,而且依据是唯一的。
public class DynamicDisplay {
public static void main(String[] args) {
QQ q = new QQ();
PP p = new PP();
B b = new BB();
B b2 = new B();
b.dd(q);
b2.dd(p);
}
static class BB extends B{
public void dd(QQ a){
System.out.println("BB--BB");
}
public void dd(PP a){
System.out.println("PP--PP");
}
}
}
class B{
public void dd(QQ q){
System.out.println("QQQQ");
}
public void dd(PP q){
System.out.println("PPPP");
}
}
class QQ{
}
class PP{
}
编译器在编译期间 存在静态分派的过程,在确定执行的方法版本的时候 存在两个依据,一个是 方法参数的类型,一个是 父类的类型。
很明显 输出的 是根据 new 出来的是哪个对象 就调用哪个对象的方法,也就是说编译器忽略了参数的类型的影响,唯一存在影响的是 此方法的接收类型,因为这是动态单分派呀,我日。