A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© android-liu 中级黑马   /  2015-3-9 22:40  /  1088 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我想问下:当使用多态时,父类引用访问被子类覆盖的方法时,为什么走的是子类的方法,而不是父类的?而访问变量时,走的又是父类的变量值。那位大神有内存图提供一下,或者有这方面的总结给在下发一个过来

2 个回复

正序浏览
1、多态中非静态成员函数的特点
        在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
如:在上面的示例中,如果用a.catchMouse();编译就会报错。这时只能通过强转,向下转型后,可以使用子类的特有功能。
        在运行时期:参阅对象所属的类中是否有调用的方法。这就是说,如果父类中有一个非抽象的方法,而子类继承后又将其复写了,在多态运行时,父类的引用调用这个同名函数时,被运行的将是父类中的方法。
        简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
2、多态中成员变量的特点
        无论编译和运行,都参考左边(引用变量所属的类)。如:多态中的父类引用调用成员变量时,如果父类和子类有同名的成员变量,那么被调用的是父类中的成员变量。
3、多态中静态成员函数的特点
        无论编译和运行,都参考左边。也就是父类引用在调用静态同名函数时,被调用的是父类中的静态函数。这是因为,当类一被加载,静态函数就随类绑定在了内存中。此时,不需要创建对象,就可以使用类名直接调用。同时,父类中的静态成员函数一般是不被复写的。
类在方法区中的分配:分为静态区和非静态区,而关键字this和super在非静态区。
回复 使用道具 举报
你就这么想吧,对象被创建于堆中,不管是子类还是父类,它们的成员变量都封装到对象里,对象要访问哪个随手拿就是了(很符合你的正常思维),但是类的成员函数是放到内在的方法区中,对象要找方法,它是在方法区中从自身找起,没用的话再找它的父类!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马