静态分派,动态分派,多分派,单分派 -------------- visitor模式预备 一,静态分派: 1,定义:发生在编译时期,分派根据静态类型信息发生,重载就是静态分派 2,什么是静态类型:变量被声明时的类型是静态类型 什么是动态类型:变量所引用的对象的真实类型 3,有两个类,BlackCat ,WhiteCat都继续自Cat 如下调用 class Cat{} class WhiteCat extends Cat{} class BlackCat extends Cat{} public class Person { public void feed(Cat cat){ System.out.PRintln("feed cat"); } public void feed(WhiteCat cat){ System.out.println("feed WhiteCat"); } public void feed(BlackCat cat){ System.out.println("feed BlackCat"); } public static void main(String[] args) { Cat wc = new WhiteCat(); Cat bc = new BlackCat(); Person p = new Person(); p.feed(wc); p.feed(bc); }
} 运行结果是: feed cat feed cat 这样的结果是因为重载是静态分派,在编译器执行的,取决于变量的声明类型,因为wc ,bc都是Cat所以调用的都是feed(Cat cat)的函数. 二,动态分派 1,定义:发生在运行期,动态分派,动态的置换掉某个方法。 还是上边类似的例子: class Cat{ public void eat(){ System.out.println("cat eat"); } } public class BlackCat extends Cat{ public void eat(){ System.out.println("black cat eat"); } public static void main(String[] args){ Cat cat = new BlackCat(); cat.eat(); } }这个时候的结果是: black cat eat 这样的结果是因为在执行期发生了向下转型,就是动态分派了。