该问题是多态里的父类引用指向子类对象,也叫动态连接。Father father = new Son();这句实际就是父类的引用指向子类的对象,
该父类引用在掉用方法和成员变量时是有区别的,调用方法时是子类重写了父类的方法,所以它自动调用子类的print方法,但是在访问成员变量时,子类继承了父类,所以会有两个同名的成员变量b,父类的成员变量对父类的引用是可见的所以会访问父类的成员变量b=6。
father.x() 就是访问静态方法的原理。
总结如下:父类引用指向子类对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.
|