(摘自看过的书籍与博客)
多态是指在程序中定义的引用变量所指向的具体类型和通过该引用发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类型对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须由程序运行期间才能确定。因为在运行时才能确定的类,不用修改代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体实现类,让程序可以选择多个运行状态。多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。
1.向上转型
对象既可作为它自身使用,也可作为它的基类使用。而这种把某个对象的引用视为对其基类型的引用的做法称为向上转型。
2.方法调用绑定
将一个方法调用同一个方法主体关联起来被称作绑定。在运行时根据对象的类型进行绑定称为运行时绑定或动态绑定。它可保证其产生正确的行为(即调用正确的具体实现方法)
interface A{
void method1();
void method2();
}
interface Factory{
A getA();
}
class B implements A{
public void method1(){
System.out.println("class B method1");
}
public void method2(){
System.out.println("class B method2");
}
}
class C implements A{
public void method1(){
System.out.println("class C method1");
}
public void method2(){
System.out.println("class C method2");
}
}
class BFactory implements Factory{
public A getA(){
return new B();
}
}
class CFactory implements Factory{
public A getA(){
return new C();
}
}
public class Test{
public static void doComsuer(Factory factory){
A a = factory.getA();
a.method1();
a.method2();
}
public static void main(String[] agrs){
doComsuer(new BFactory());
doComsuer(new CFactory());
}
}
//out
class B method1
class B method2
class C method1
class C method2
3.可扩展性:
通过从通用的基类继承出新的类型,添加一些功能,那些操作基类接口的方法不需要任何变动就可以应用于新类。
4.初始化顺序
基类静态代码块
子类静态代码块
基类非静态代码块
基类静态属性
子类静态属性
基类普通属性
基类构造方法
子类普通属性
子类非静态代码块
子类构造方法
5.清理
清理顺序与初始化顺序相反,首先对其导出类进行清理,然后才是基类。
6.构造器内部的多态方法的行为
编写构造器是:“用尽可能简单的方法使对象进入正常状态,避免调用其它方法”。如果基类中调用子类中也重写的方法,会指向子类中的方法,子类因为没有初始化而可能导致结果出错。
7.用继承进行设计
用继承表达行为上的差异,并用字段表达状态上的变化。
8.向下转型
运行时类型识别,转型出错会报“ClassCastException”异常(类型转换异常)。可用instanceof进行判断。
多态意味着“不同的形式”,在面向对象的程序设计中,我们持有从基类继承而来的相同接口,以及使用接口的不同形式:不同版本的动态绑定。