JAVA-初步认识-第十章-对象的初始化过程
Posted 照破山河万朵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-初步认识-第十章-对象的初始化过程相关的知识,希望对你有一定的参考价值。
一.
现在简单地将内存图解简单地串一串,从之前的到现在的全部组合起来讲述一下,
编译运行的结果为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进入子类对象。
以上是关于JAVA-初步认识-第十章-对象的初始化过程的主要内容,如果未能解决你的问题,请参考以下文章