标签:
多态分离做什么和怎么做。又成为动态绑定,后期绑定或运行时绑定。
8.1再论向上转型
对象可以当做它的父类型来使用,称为向上转型。
一个方法接受父类为参数,所有的子类都能调用这个方法,编译器在编译时间不确定执行哪个方法,在运行时间根据相应的子类是否重写了方法决定调用哪个方法,这样做大大减少了编程。
8.2转机?
8.2.1方法调用绑定
将方法调用和方法主体关联起来被称作绑定。
后期绑定:在运行时根据对象的类型进行绑定
编译器不知道对象的类型(因为编译器只知道这是个父类,不知道是哪个子类传入的)
Java中除了static方法和final方法外都是后期绑定。
8.2.2产生正确的行为
编译器只知道对象是一种父类,只有到运行时间才知道对象具体是什么类,并执行正确的行为。
8.2.3 可扩展性
操作基类的方法不用经过任何修改!
Parent s=new Son();
发生了什么:new一个子类,为子类申请空间,但向上转型后子类增加的部分就不可见了(仍然存在!),调用方法也优先考虑子类覆盖的方法!
8.2.4 缺陷:“覆盖”私有方法
覆盖private方法不会报错,但语义不是覆盖,而是新方法,向上转型后就不可见了,达不到多态的效果。
因此,要避免“覆盖”private方法,应该起一个不同的名字!
8.2.5 缺陷:域与静态方法
域(成员变量)是在编译时间绑定的,是不会覆盖的。
如果子类和父类域名相同,则各自有各自的空间,向上转型后子类的域就不可见了(除非调用子类覆盖的方法)
实践中应该避免这种情况,首选尽量将所有的域定义为private,其次不要为子类加一个同名的域!
静态方法也不具有多态性。
标签:
原文地址:http://www.cnblogs.com/cjrzh/p/4512974.html