一.

现在简单地将内存图解简单地串一串,从之前的到现在的全部组合起来讲述一下,

编译运行的结果为9,按照我们之前的认识来看,对象先是默认初始化,然后显示初始化,最后是构造器初始化,这是从我们的DOS结果看出来的(如果构造器初始化在前的话,输出就是0)。

在继承的时候,这个顺序已经澄清了。

要澄清的话,是这样的,

编译的结果第一行是0,我们在创建对象时,在成员变量num默认初始化之后,如果后面进行的是显示初始化num=9,那么show()方法打印的应该是9,而不是0,说明显示初始化没有这么快操作。编译的结果为什么是这样,直接解释过,有了继承以后,子类里面有一句隐式的super();这里在对象进行成员变量默认初始化后,接着进行的是子类的构造函数。子类的构造函数里面碰到了super();接着就去了父类的构造函数,而父类的构造函数的方法体里面是show()方法。而show()方法是子类在调用,走的是覆盖后的方法,所以打印的是子类的show()方法的方法体(为什么执行父类的方法时,操作的是被子类覆盖的方法?),这时,num还没有被显示初始化,因此打印的是num=0。因此,显示初始化是在父类构造函数之后。

为什么到了子类的构造器,num就是9了?说明在super()之后,有显示初始化。这个问题,我们已经解决过了(为什么现在又忘记了,说明还是注重的怎么操作,而是怎么来的。理解了怎么来的,也就明白了怎么操作。)

本质上是构造器先执行的,后来插入了显示初始化。但是不可否认的是,构造器先于显示初始化出现的。(要知道,我们一new对象,构造方法就进栈了。到底是怎么在构造器里,启动显示初始化的?)

早期我们在谈论的时候,好像是构造器后执行的。

二.

接下来再对程序做一个修改,来展现在不同情况下的初始化流程。

截图中的程序里,存在一个构造代码块,这样该如何进行初始化。

编译结果显示,构造器在构造函数之前。因此,我们可以得到的结论就是,构造代码块在构造器之前先执行。是否真是这样?

(怎么在构造代码块时,num就已经是9了?)

下面对程序进行扩展(补全子父类来讲述整个过程),来讲述整个初始化过程。

父类show()方法中的“hehe”是无所谓的,它不运行,因为它被子类覆盖了。

(从主函数中的程序来看,只有一句创建对象。编译运行的结果全是创建对象过程中出现的)

以截图中的程序来讲解初始化的过程,主函数的方法体中只有一个创建对象语句,new Zi();

编译运行的结果如下,通过结果来仔细分析整个过程的每一步。

讲解内存图解离不开cpu内部结构,栈,堆以及方法区,三部分。

一new子对象,就加载子类,子父类就加载进来了。这是继承体系,所以不光是加载子类,而是连着父类一起进入方法区。

整个过程是这样的,需要创建子类对象,由于创建的是子类的对象,因此需要加载子类进入方法区,而且这是属于继承体系,所以不光是子类进入方法区,父类一样要进入方法区。子父类中的代码全部加载进入方法区,方法区是起存储的作用。先存储这些程序,然后在栈和堆中调用这些方法区的代码。

创建对象的过程是这样的,现是加载子父类,然后在堆中开辟空间,载入成员变量,默认初始化值。接下来的所有步骤都是在初始化过程。先是将子类构造函数载入栈中,子类构造函数中第一句是super(); 这句话就是在调用父类的构造函数,父类中有两句话,第一句是不涉及任何成员,单纯地输出一个语句。第二句就是使用show()方法(为什么父类构造函数中,使用的show()方法不是父类的show(),而是子类的show()方法?视频给出的答案是,这一切都是子类在调用,这是前提,因此,调用show()方法,先是看子类中有没有,子类中有show()方法,因此使用自己的show()方法。),调用子类show()方法时,需要输出num,子类对象有num,而且只进行了默认初始化,这样一来,输出的就是num=0。上面的一切都是子类构造函数中super()语句,下面截图中标注了初始化的几步,super(),显示初始化,构造代码块初始化,以及剩余子类构造函数初始化。

借用下面的例子来回忆一下初始化过程,

本例创建对象时,子父类都有num,要存两个num进入子类对象。

更多相关文章

  1. Java:如何创建特定父类型的集合而不是其子类型?
  2. Java虚拟机:类的初始化
  3. Java-子类和父类的几种关系
  4. [置顶] Java中的类装载和初始化模块

随机推荐

  1. [51CTO]Android消息机制
  2. Android中的动画详解系列【4】——Activi
  3. 解决Android 状态栏重叠
  4. android api 完整翻译之Application Fund
  5. Android EditText 学习笔记
  6. Android市场将持续爆发
  7. Android 手势识别判断,GestureDetector封
  8. Android - 约束布局实现一个简单的登陆界
  9. 我对学习delphiTeacher的《delphi调用及
  10. Android注解:自定义注解之源码注解