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, 还可以用下面这个静态方法

// 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 被加载到内存

转载于:https://juejin.im/post/5d01ac86f265da1baa1e6d9a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值