多态出现的缘由:java的引用变量有两种类型:一个是编译时的类型,一个是运行时类型。
编译时类项:声明该变量时使用的类型决定。
运行时类项:实际赋给该变量的对象决定
如果编译时和运行时类项不一样就会出现所谓的多态(polymorphism)。
多态:相同类项的变量执行同一个方法时,呈现出不同的行为特征这就是多态。
注意:引用变量在编译阶段只能调用其编译时类项所具有的方法,但运行时则执行运行时类项所具有的方法,因此编译java代码时,引用变量只能调用声明该变量时类项里包含的方法,如:Object p = new Person()定义一个变量p,p只能调用Object类得方法而不能调用person类里定义的方法。
与方法不同的是对象的属性则不具有多态性:
Class BaseClass{
Public int book = 9;
}
Class SubClass extends BaseClass{
Public String book = “子类属性”;
}
BaseClass bc = new BaseClass();
SubClass sc = new SubClass();
BaseClass bsc = new SubClass();
上面程序显示创建了3个对象,实际内存里包含了5个人对象(如果不算BaseClass继承java.lang.Object类)因为当系统创建sc,bsc两个变量所引用的对象时系统会隐式的为其各自创建对应的父类对象,其父类对象可以在SubClass中通过super引用来访问,因此不管是sc还是bsc变量,它们都可访问到两个book属性,其中一个来自BaseClass的实例属性,一个来自SubClass中的实例属性,通过引用变量来访问其实例属性时,系统总是试图访问编译时类所定义的属性,而不是运行时类所定义的属性。 |
|