当子类继承父类的一个public方法时,内存中有几个public方法?

当子类继承父类的一个public方法时,内存中有几个public方法?

class Man
{
    public function smile()
    {
    }
}

class Zhang extends Man
{
}

子类Zhang继承的public方法smile(),是和父类Man的smile()方法指向同一块内存吗?还是子类和父类的方法,分别指向不同的内存?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
guly 2018-11-25 09:51:06

你好,建议参考:1.从对象的内存角度来理解.
假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,里面的变量需要占用0.5M内存.
现在通过代码来看看内存的分配情况:
2.f = new Father();//系统将分配1M内存.
Son s = new Son();//系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用父类的方法.
3.Son s1 = s;//s1指向那1.5M的内存.
Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存,即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).
Son s2 = (Son)f;//这句代码运行时会报ClassCastException.因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.
Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

4.static

顾名思义,就是静态的,他是方法的,他属于这个类,由于是类的方法,他可以直接引用类名来引用方法,也可以通过类的对象来引用这个方法,他既不能被子类覆
盖,也不能被子类继承。简单的说,他是在编译的时候就和类帮定在一起了,不能被运行时动态加载。

对子类与父类的static问题
——没覆盖也没继承,子类存有指向父类的引用

对于private
——该方法或属性只能在该类内使用。

  • 提问者 T时间的朋友 #1
    这么说,子类继承的父类中public的方法,在子类中也是一个指向父类该方法的引用?是这样吗?如果被子类重写,则在子类中新开辟一块内存,存放新的方法,是吗?
    2018-11-25 10:48:54
  • guly 回复 提问者 T时间的朋友 #2
    你好,是的,祝学习愉快!
    2018-11-26 09:58:49
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师