JVM 数组创建的本质
1、创建数组
创建一个MyParent4[] 数组
public class MyTest4 {
public static void main(String[] args) {
MyParent4[] myParent4s = new MyParent4[1];
System.out.println(myParent4s.getClass());
}
}
class MyParent4{
static {
System.out.println("MyParent4 static block");
}
}
打印结构

说明此处并不符合主动使用的场景,所有不会初始化MyParent4。 打印myParent4s.getClass()的结果为数组类型。[Lcom.example.jvm.classloader.MyParent4 这个类型是JVM在运行期创建出来的。
2、完整的创建数组代码
public class MyTest4 {
public static void main(String[] args) {
MyParent4[] myParent4s = new MyParent4[1];
System.out.println(myParent4s.getClass());
MyParent4[][] myParent4s1 = new MyParent4[1][1];
System.out.println(myParent4s1.getClass());
System.out.println(myParent4s.getClass().getSuperclass());
System.out.println(myParent4s1.getClass().getSuperclass());
int[] ints = new int[1];
System.out.println(ints.getClass());
System.out.println(ints.getClass().getSuperclass());
}
}
class MyParent4{
static {
System.out.println("MyParent4 static block");
}
}
打印结果
class [Lcom.example.jvm.classloader.MyParent4;
class [[Lcom.example.jvm.classloader.MyParent4;
class java.lang.Object
class java.lang.Object
class [I
class java.lang.Object
反编译
Compiled from "MyTest4.java"
public class com.example.jvm.classloader.MyTest4 {
public com.example.jvm.classloader.MyTest4();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return public static void main(java.lang.String[]);
Code:
0: iconst_1
1: anewarray #2 // class com/example/jvm/classloader/MyParent4
4: astore_1
5: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
8: aload_1
9: invokevirtual #4 // Method java/lang/Object.getClass:()Ljava/lang/Class;
12: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
15: iconst_1
16: iconst_1
17: multianewarray #6, 2 // class "[[Lcom/example/jvm/classloader/MyParent4;"
21: astore_2
22: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
25: aload_2
26: invokevirtual #4 // Method java/lang/Object.getClass:()Ljava/lang/Class;
29: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
32: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
35: aload_1
36: invokevirtual #4 // Method java/lang/Object.getClass:()Ljava/lang/Class;
39: invokevirtual #7 // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
42: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
45: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
48: aload_2
49: invokevirtual #4 // Method java/lang/Object.getClass:()Ljava/lang/Class;
52: invokevirtual #7 // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
55: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
58: iconst_1
59: newarray int
61: astore_3
62: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
65: aload_3
66: invokevirtual #4 // Method java/lang/Object.getClass:()Ljava/lang/Class;
69: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
72: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
75: aload_3
76: invokevirtual #4 // Method java/lang/Object.getClass:()Ljava/lang/Class;
79: invokevirtual #7 // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
82: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
85: return
}
助记符:
anewarray: 表示创建一个引用类型的(如类、接口、数组)数组,并将其引用值压如栈顶 (1: anewarray #2)
newarray: 表示创建一个指定的原始类型(如int,float,char等)的数组,并将其引用值压入栈顶 ( 59: newarray int)
JVM 数组创建的本质的更多相关文章
- OC1_数组创建
// // main.m // OC1_数组创建 // // Created by zhangxueming on 15/6/11. // Copyright (c) 2015年 zhangxuemi ...
- Swift3中数组创建方法
转载自:http://blog.csdn.net/bwf_erg/article/details/70858865 数组是由一组类型相同的元素构成的有序数据集合.数组中的集合元素是有 序的,而且可以重 ...
- 第四百一十三节,python面向对象,组合、类创建的本质、依赖注入
组合 组合举例组合就是多个类,或者若干类联合起来完成一个任务下面举例两个类联合起来完成一个任务为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实例化后传参到另外一个来这 ...
- NumPy 从已有的数组创建数组
NumPy 从已有的数组创建数组 本章节我们将学习如何从已有的数组创建数组. numpy.asarray numpy.asarray 类似 numpy.array,但 numpy.asarray 只有 ...
- java数组创建
java数组创建:int[] number = new int[10]; int[]:表明这是一个数组 new int[10]:给前面的数组类型的number变量分配10个int类型的空间大小
- numpy 数组创建例程
1 numpy.empty empty(shape[, dtype=float, order='C']) 创建指定 shape 和dtype 的未初始化数组 返回:ndarray. 说明:order ...
- js数组之有已有数组创建新的数组
concat()和splice()方法允许通过已经有的数组创建新的数组 concat()这个方法可以合并多个数组创建一个数组 splice()这个方法是获得截取一个数组中的子集创建一个新的数组. 理论 ...
- NumPy数组创建例程
NumPy - 数组创建例程 新的ndarray对象可以通过任何下列数组创建例程或使用低级ndarray构造函数构造. numpy.empty 它创建指定形状和dtype的未初始化数组. 它使用以下构 ...
- JavaScript中的数组创建
JavaScript中的数组创建 数组是一个包含了对象或原始类型的有序集合.很难想象一个不使用数组的程序会是什么样. 以下是几种操作数组的方式: 初始化数组并设置初始值 通过索引访问数组元素 添加新元 ...
随机推荐
- 微信小程序(小游戏)后台开发
小程序开放接口功能,目的是方便小程序接入第三方服务器,比如,商城类小程序,小游戏,需要保存订单数据,玩家信息等.那就需要服务器和数据库, 开发者对于各方关系必须要理清,那就是小程序,用户,开发者服务器 ...
- Altium designer 如何将2D PCB转换成3D
点击键盘数字键的3,即可,2键可以切换回2D效果,但是如果要看元器件的3D效果,那么元器件封装必须带有3D模型才行! 先按3切换到三维界面,然后按住shift不放,按鼠标右键调整视图角度.
- 使用Cloudera Manager搭建MapReduce集群及MapReduce HA
使用Cloudera Manager搭建MapReduce集群及MapReduce HA 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.通过CM部署MapReduce On ...
- WXS介绍
WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构. 1.WXS与JS的区别 1.1 WXS 的基础类库: WXS 只提供给开发者5个基础类库,分别是 c ...
- (一)WCF基础
我们近期在做项目的时候用到了WCF,之前已经看了部分视频,对于WCF有了一定的了解,但仅限于能够根据搭建好的框架使用WCF,还不了解.所以就进行了研究,这样既有实践也能增加理论,二者结合,使用起来更胜 ...
- SVM: 用kernels(核函数)来定义新的features,避免使用多项式,高斯kernel
应用kernels来进行非线性分类 非线性分类:是否存在好的features的选择(而不是多项式)--f1,f2,f3.... 上图是一个非线性分类的问题,前面讲过,我们可以应用多项式(feature ...
- [RxJS] Subject asObservable() method
You can create your own state store, not using any state management libraray. You might have seen th ...
- yaml文件
apiVersion: apps/v1beta1 kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: ...
- Django 第一天 开端
今日内容: 一.HTTP协议 1.HTTP协议简介 参考博客:https://www.cnblogs.com/clschao/articles/9230431.html 是超文本传输协议 现在使用最广 ...
- 2019/10/22 test T1 题解
题目描述 给定n个a[i],b[i],求min(x$\in$R){$\sum\limits_{i=1}^{n}$|a[i]*x+b[i]|} 输入格式 第 1行 1个整数 n第 2行 n个整数,第 i ...