本帖最后由 michael_wlq 于 2015-9-1 10:54 编辑
当多态中的父类型的引用指向子类型的对象时,例如:Parent p = new Child(); 编译看左边,运行看右边。左边是编译期检测的行为,而右边的生成对象的new是运行期行为,所以当此时父类型的引用调用了子类型中特有的方法时会编译报错。如果想使用子类特有方法,则需要将父类型的引用向下强制转换成子类型的引用。
【注意】在继承体系中,成员变量跟着类一起加载,编译期会存放在方法区,此时为一个已经赋值的常量,所以成员变量是不存在覆盖的,当子父类中都定义了成员变量num时,且有下面语句:Parent p = new Child();
Child c = new Child();
则p.num会输出父类中num的值,c.num则会输出子类中num的值。
----------------------------------------------------------------------------------------------------------------------------------
class Parent {
int num = 10;
void method1() {
System.out.println("parent's method !!");
}
}
class Child extends Parent {
int num = 20;
void method2() {
System.out.println("Child's method !!");
}
}
class TestDemo {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println(p.num); //输出10
System.out.println(c.num); //输出20
p.method1(); //会执行父类中的method1()方法,因为子类没有重写该方法
p.method2(); //编译出错,父类型中没有method2()方法,因此编译器会报错
}
}
|
|