关于为什么子类可以通过set方法来获取父类的private属性

        通过一个实例来证明: 子类实例化的时候并没有实例化父类的对象

 

 Java源码被编译成字节码文件,字节码被加载到JVM方法区去的时候,其实类的对象被加载到方法区的时候,就已经决定了这个对象是什么样子的.         所有的Java的对象由两个部分组成"对象头和对象体"

对象头存放的是:类信息

对象体: 比如多子类对象有许多成员变量,但这些成员变量要实例化后才有实际意义,那么成员在方法体力,而从父类中继承而来的成员变量也存放于方法体中.

而 this 和 super 这两个关键字原则上没有区别,硬要说区别的话,是:

  • this指向的是自己的其中一部分 (本身的成员)
  • super指向的是自己的另一部分(从父类继承过来的部分)
  • 但实际上都指向子类自己的内存空间.

证明:

 

 创建了一个子类和父类,其中父类的成员有一个weight,子类有一个age,然后再"======="处打一个段点来Debug,实例化子类后,调用子类的uniqueMethod方法

 

 

 

 所以我们可以得到,在子类实例化的时候,并没有同时实例化父类,而是在子类的字节码被加载到方法区的时候就已经觉得了他的成员有什么,其信息分别存放在对象头和对象体中,然后通过this 和 super 来对不同部分的本身的成员来进行调用.

实际上起作用的方法是init方法.构造方法的作用只有用来初始化属性的作用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值