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 有關吧
總結一下:
不論是以哪一種方式去實例化對象,我們要明白的是,實例化一個對象之前,內存中必須要有一個類對象,或者說 Class 被加載到內存
如有錯誤請指出,覈實後立即改正