Java中各種對象的各種實例化方式

Java 中萬物皆對象,Linux 中一切皆文件。
簡單的說下對象的實例化過程:

  • 首先我們需要有個意識,就是創建一個類的實例化對象,內存中必須要加載了這個類
  • 所以,不論是 new 還是反射或是 Unsafe.allocateInstance(Class),都必須要先找到類對象的內存地址
  • 然後知道類對象的結構,再去堆上申請新的空間,即實例化對象
  • 順帶說下,Java 佔內存的原因正是因爲對象攜帶的信息很豐富

Object:萬物源頭

隱式加載類到內存,再實例化對象

// new
Object obj = new Object();

// Unsafe.allocateInstance
Object obj = Unsafe.allocateInstance(Object.class);

// Class.newInstance 是無參構造,最後調用的是 Constructor.newInstance (可帶參構造)
Class<String> cls = Class.forName("java.lang.String");
String str = cls.newInstance();

// 其它的還有序列化 clone 

基礎類型的包裝類: "="右邊可以直接賦值

// 常量池中申請
String str = "string";

// 虛擬機回調 Integer 的靜態方法 valueOf(int i) 靜態方法說明類已經被加載到內存了
Integer i = 100;

數組:一切容器的基礎

數組除了 new 還可以用下面這個靜態方法
這個方法在很多框架中用到,因爲你只要給我個 CLass,我就可以構造一個數組

// Array.newInstance 調用 native 方法 構造一個長度 16 的 int 數組
int[] o = (int[]) Array.newInstance(int.class, 16); // 一維
// 以下都是可以成功構造的 無非是數組嵌套數組
// int[][] o = (int[][]) Array.newInstance(int[].class, 16); // 二維
// int[][][] o = (int[][][]) Array.newInstance(int[][].class, 16); // 三維

看圖說話:

  • 該方法還是有一些框架使用到的
  • 對於傳入的的類型和數組的維度是有限制的,維度限制可能和 byte 有關吧
    array

總結一下:

不論是以哪一種方式去實例化對象,我們要明白的是,實例化一個對象之前,內存中必須要有一個類對象,或者說 Class 被加載到內存

如有錯誤請指出,覈實後立即改正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章