【JAVA基础篇】对象初始化过程
我們都知道,創(chuàng)建對象是由 new關(guān)鍵字調(diào)用構(gòu)造方法 返回類實例(實際上還可以通過反射來創(chuàng)建實例)。
例如 : Person jack = new Person();
這句話到底做了什么事情呢 ? 其實就是講對象的初始化過程。
- 1、 new 用到了Person.class,所以會先找到Person.class文件,并加載到內(nèi)存中(用到類中的內(nèi)容類就會被加載)
- 2、執(zhí)行該對象的static代碼塊(靜態(tài)初始塊)。(如果有的話,給Person.class類進行初始化)
- 3、在堆內(nèi)存中開辟空間,分配內(nèi)存地址
- 4、在堆內(nèi)存中建立對象特有屬性,并進行默認初始化
- 5、對屬性進行顯示初始化(聲明成員屬性并賦值)
- 6、執(zhí)行構(gòu)造塊
- 7、執(zhí)行構(gòu)造函數(shù)
- 8、將內(nèi)存地址賦值給棧內(nèi)存中的jack變量
如下圖:
下面我們來看兩個案例
案例一:
以下代碼的輸出結(jié)果是什么?
public class B {public static B t1 = new B();public static B t2 = new B();{System.out.println("構(gòu)造塊");}static {System.out.println("靜態(tài)塊");}public static void main(String[] args) {B t = new B();} }答案是:
構(gòu)造塊
構(gòu)造塊
靜態(tài)塊
構(gòu)造塊
答案分析:JVM先加載B這個類,初始化靜態(tài)域(靜態(tài)變量、靜態(tài)塊和靜態(tài)方法,按照代碼先后順序初始化),先初始化t1,t2,所以先輸出構(gòu)造塊 構(gòu)造塊;然后執(zhí)行靜態(tài)塊,所以輸出靜態(tài)塊;最后執(zhí)行new B()輸出構(gòu)造塊
案例二:
一下代碼的輸出結(jié)果是什么?
public class B {static {i = 100;}public static int i = 1;public static void main(String[] args) {System.out.println(i);} }答案是:1
答案分析:靜態(tài)變量是在類初始化時首先被加載的,JVM會去查找類中所有的靜態(tài)聲明,然后分配空間,注意這時候只是完成了地址空間的分配,還沒有賦值,之后JVM會根據(jù)類中靜態(tài)賦值(包括靜態(tài)類賦值和靜態(tài)塊賦值)的先后順序來執(zhí)行。對于程序來說,就是先聲明了int類型的地址空間,并把地址傳遞給了i,然后按照類中的先后順序執(zhí)行賦值動作,首先執(zhí)行靜態(tài)塊中i=100,接著執(zhí)行i=1,那最后的結(jié)果就是i=1了。
總結(jié)
以上是生活随笔為你收集整理的【JAVA基础篇】对象初始化过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天融信防火墙重置配置_天融信防火墙配置手
- 下一篇: 什么叫大数据人物画像_大数据时代,如何构