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

Java 中萬物皆對象,Linux 中一切皆文件java

先簡單的說下對象的實例化過程:數組

  • 首先咱們要有個意識,就是建立一個類的實例化對象,內存中必須已經加載了這個類
  • 因此,不管是 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, 還能夠用下面這個靜態方法框架

// 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); // 三維
複製代碼

以下圖:spa

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

總結一下

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

相關文章
相關標籤/搜索