通过一个实例来证明: 子类实例化的时候并没有实例化父类的对象
Java源码被编译成字节码文件,字节码被加载到JVM方法区去的时候,其实类的对象被加载到方法区的时候,就已经决定了这个对象是什么样子的. 所有的Java的对象由两个部分组成"对象头和对象体"
对象头存放的是:类信息
对象体: 比如多子类对象有许多成员变量,但这些成员变量要实例化后才有实际意义,那么成员在方法体力,而从父类中继承而来的成员变量也存放于方法体中.
而 this 和 super 这两个关键字原则上没有区别,硬要说区别的话,是:
- this指向的是自己的其中一部分 (本身的成员)
- super指向的是自己的另一部分(从父类继承过来的部分)
- 但实际上都指向子类自己的内存空间.
证明:
创建了一个子类和父类,其中父类的成员有一个weight,子类有一个age,然后再"======="处打一个段点来Debug,实例化子类后,调用子类的uniqueMethod方法
所以我们可以得到,在子类实例化的时候,并没有同时实例化父类,而是在子类的字节码被加载到方法区的时候就已经觉得了他的成员有什么,其信息分别存放在对象头和对象体中,然后通过this 和 super 来对不同部分的本身的成员来进行调用.
实际上起作用的方法是init方法.构造方法的作用只有用来初始化属性的作用.