日期:2014-05-20  浏览次数:20585 次

请教 当把一个子类赋给父类的引用时 这个对象的类型到底属于父类还是子类?
如 class A 是class B 的父类
执行A aa = new B();语句后 aa是父类类型吗?还是子类的一个实例?

------解决方案--------------------
子类的实例,父类的引用,只能使用父类提供的方法
------解决方案--------------------
aa的编译类型是A类型,运行时类型是B
直接访问属性等在编译器确定的东西调用的都是编译时类型对应的,除了编译时确定的东西,java的普通方法是运行时动态绑定的。当调用子类B override方法时调用的还是B的而不是A的。
简单代码:
Java code
class Parent {
    int i = 3;

    void test() {
        System.out.println("Parent test()");
    }
}

class Child extends Parent {
    int i = 5;

    void test() {
        System.out.println("Child test()");
    }
}

public class HackersterTest {
    public static void main(String[] args) {
        Child c = new Child();
        System.out.println(c.i);// 输出5
        c.test();// 输出Child test()
        Parent p = c;
        System.out.println(p.i);// 输入3
        p.test();// 输出Child test()
    }
}

------解决方案--------------------
这是java多态的体现

要弄清楚编译期类型和运行时类型

就是说在编译的时候子类对象就被当做父类了,而在运行的时候就表现出子类的特性

编译的时候他只管能不能通过就成为编译其类型而运行的时候就是运行时类型