1. 定义:
Java应用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就肯能出现所谓的多态。
2. 代码案例
2.1 父类
package com.zit;
public class Parent1 {
public int book = 6;
public void base() {
System.out.println("父类的普通方法");
}
public void test() {
System.out.println("父类的测试方法");
}
}
2.2 子类
package com.zit;
public class Children1 extends Parent1 {
public String book = "轻量级JavaEE企业应用实战";
public void test() {
System.out.println("子类的测试方法");
}
public void sub() {
System.out.println("子类的普通方法");
}
}
2.3 测试类
package com.zit;
public class Test {
public static void main(String[] args) {
//编译时类型是Parent1 所以运行时类型是Children1
Parent1 d1 = new Children1();
//此处调用父类的实例变量book
System.out.println(d1.book);
//此处调用父类的方法base()
d1.base();
//此处调用的是子类的方法test()
d1.test();
}
}
注意:
2.4 测试结果
3. 总结
在上面的测试方法当中,创建了一个引用变量,d1,它的编译时类型是Parent1运行时类型是Children1,当调用该引用变量的test()方法(父类定义该方法,子类覆盖了该方法)时,实际执行的是子类Children类中覆盖后的test()方法,这就出现多态了。
当一个子类对象直接赋给父类应用变量时,例如上面的,Parent1 d1 = new Children1(); 这个d1应用变量的编译时期类型是Parent1,而运行时类型Children1,当运行时调用该引用变量,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。
与方法不同的是,对象的示例变量不具备多态性。不如上面的d1引用变量,程序中输出它的book实例变量时,并不是输出Children1类里面定义的实例变量,而是输出Parent1类的示例变量。
注意1:
引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法。因此,编写Java代码时,引用变量只能调用声明该变量时所用类里包含的方法。
注意2:
通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译时类型所定义的成员变量、而不是它运行时类型所定义的成员变量。