java類的初始化和例項化區別 java類的初始化和例項化區別String s=new String("abc")建立了幾個物件?
java類的初始化和例項化區別
結論:
參考https://blog.csdn.net/qq_43672627/article/details/86616624
類的初始化:是完成程式執行前的準備工作。在這個階段,靜態的(變數,方法,程式碼塊)會被執行。同時在會開闢一塊儲存空間用來存放靜態的資料。初始化只在類載入的時候執行一次。
類的例項化:是指建立一個物件的過程。這個過程中會在堆中開闢記憶體,將一些非靜態的方法,變數存放在裡面。在程式執行的過程中,可以建立多個物件,既多次例項化。每次例項化都會開闢一塊新的記憶體。
1.主要區別
2.基礎知識
2.1java類的生命週期:
指一個class檔案從載入到解除安裝的全過程,類的完整生命週期包括7個部分:載入——驗證——準備——解析——初始化——使用——解除安裝,如下圖所示
其中,驗證——準備——解析 稱為連線階段,除了解析外,其他階段是順序發生的,而解析可以與這些階段交叉進行,因為Java支援動態繫結(晚期繫結),需要執行時才能確定具體型別;在使用階段例項化物件
2.2類載入過程:
載入:通過類名獲取類的二進位制位元組流是通過類載入器來完成的。其載入過程使用“雙親委派模型”
驗證:當一個類被載入之後,必須要驗證一下這個類是否合法,比如這個類是不是符合位元組碼的格式、變數與方法是不是有重複、資料型別是不是有效、繼承與實現是否合乎標準等等。總之,這個階段的目的就是保證載入的類是能夠被jvm所執行。
準備:為類變數(靜態變數)在方法區分配記憶體,並設定零值。注意:這裡是類變數,不是例項變數,例項變數是物件分配到堆記憶體時根據執行時動態生成的。
解析:把常量池中的符號引用解析為直接引用:根據符號引用所作的描述,在記憶體中找到符合描述的目標並把目標指標指標返回。
初始化:類的初始化過程是這樣的:按照順序自上而下執行類中的變數賦值語句和靜態語句,如果有父類,則首先按照順序執行父類中的變數賦值語句和靜態語句在類的初始化階段,只會初始化與類相關的靜態賦值語句和靜態語句,也就是有static關鍵字修飾的資訊,而沒有static修飾的賦值語句和執行語句在例項化物件的時候才會執行。執行<clinit>()方法(clinit是class initialize的簡寫)
例項化:在堆區分配記憶體空間,執行例項物件初始化,設定引用變數a指向剛分配的記憶體地址
2.3 執行時區記憶體分配
3.具體流程
類A
public class A { private int m=2; private String str1="youyou"; public final static String MESS="world"; static String ms="world"; public String getName(String input){ String temp=input; return temp; } public static int getId(){return 0;} }
Test類
public class Test { public static void main(String[] args) { Class clazz=A.class; A a=new A(); A a1=new A(); } public void change(int i) { i=123; } }
以上面來舉例
引用物件:A中成員B b,b即為引用物件,
常量三種:8種基本資料型別byte boolean,char short,float int,dobule long的具體的值,
受final修改的變數
“”雙引號引起來的字串
附:
String s=new String("abc")建立了幾個物件?java記憶體分配圖解:https://blog.csdn.net/shunfa888/article/details/79765031
類成員變數和區域性變數記憶體分配:https://www.cnblogs.com/chuanqi1995/p/11644334.html
類的載入過程詳解:https://blog.csdn.net/yanliguoyifang/article/details/80964237
結論:
參考https://blog.csdn.net/qq_43672627/article/details/86616624
類的初始化:是完成程式執行前的準備工作。在這個階段,靜態的(變數,方法,程式碼塊)會被執行。同時在會開闢一塊儲存空間用來存放靜態的資料。初始化只在類載入的時候執行一次。
類的例項化:是指建立一個物件的過程。這個過程中會在堆中開闢記憶體,將一些非靜態的方法,變數存放在裡面。在程式執行的過程中,可以建立多個物件,既多次例項化。每次例項化都會開闢一塊新的記憶體。
1.主要區別
2.基礎知識
2.1java類的生命週期:
指一個class檔案從載入到解除安裝的全過程,類的完整生命週期包括7個部分:載入——驗證——準備——解析——初始化——使用——解除安裝,如下圖所示
其中,驗證——準備——解析 稱為連線階段,除了解析外,其他階段是順序發生的,而解析可以與這些階段交叉進行,因為Java支援動態繫結(晚期繫結),需要執行時才能確定具體型別;在使用階段例項化物件
2.2類載入過程:
載入:通過類名獲取類的二進位制位元組流是通過類載入器來完成的。其載入過程使用“雙親委派模型”
驗證:當一個類被載入之後,必須要驗證一下這個類是否合法,比如這個類是不是符合位元組碼的格式、變數與方法是不是有重複、資料型別是不是有效、繼承與實現是否合乎標準等等。總之,這個階段的目的就是保證載入的類是能夠被jvm所執行。
準備:為類變數(靜態變數)在方法區分配記憶體,並設定零值。注意:這裡是類變數,不是例項變數,例項變數是物件分配到堆記憶體時根據執行時動態生成的。
解析:把常量池中的符號引用解析為直接引用:根據符號引用所作的描述,在記憶體中找到符合描述的目標並把目標指標指標返回。
初始化:類的初始化過程是這樣的:按照順序自上而下執行類中的變數賦值語句和靜態語句,如果有父類,則首先按照順序執行父類中的變數賦值語句和靜態語句在類的初始化階段,只會初始化與類相關的靜態賦值語句和靜態語句,也就是有static關鍵字修飾的資訊,而沒有static修飾的賦值語句和執行語句在例項化物件的時候才會執行。執行<clinit>()方法(clinit是class initialize的簡寫)
例項化:在堆區分配記憶體空間,執行例項物件初始化,設定引用變數a指向剛分配的記憶體地址
2.3 執行時區記憶體分配
3.具體流程
類A
public class A { private int m=2; private String str1="youyou"; public final static String MESS="world"; static String ms="world"; public String getName(String input){ String temp=input; return temp; } public static int getId(){return 0;} }
Test類
public class Test { public static void main(String[] args) { Class clazz=A.class; A a=new A(); A a1=new A(); } public void change(int i) { i=123; } }
以上面來舉例
引用物件:A中成員B b,b即為引用物件,
常量三種:8種基本資料型別byte boolean,char short,float int,dobule long的具體的值,
受final修改的變數
“”雙引號引起來的字串
附:
String s=new String("abc")建立了幾個物件?java記憶體分配圖解:https://blog.csdn.net/shunfa888/article/details/79765031
類成員變數和區域性變數記憶體分配:https://www.cnblogs.com/chuanqi1995/p/11644334.html
類的載入過程詳解:https://blog.csdn.net/yanliguoyifang/article/details/80964237
分類: jvm及原理