第8章 1.数组

数组类由Java虚拟机在运行时生成

普通的类从class文件中加载,但是数组类不是加载的 ,就是classload生成的,

给classLoad [开头的类名,classLoad如果没存,就会去自己new一个(不用去搜寻对应.class文件)
如下:ArrayClass继承Class 但是除了类名 其他属性都是固定的

public ArrayClass(String arrayClassName,MyClassLoader myClassLoader) {
        super();
        name=arrayClassName;
        classLoader=myClassLoader;

        //数组类同一的 都是这些↓
        accessFlags=ACC_PUBLIC;
        initStarted=true;
        superClass=myClassLoader.loadClass("java/lang/Object");
        interfaces=new JClass[2];
        interfaces[0]=myClassLoader.loadClass("java/lang/Cloneable");
        interfaces[1]=myClassLoader.loadClass("java/io/Serializable");
    }

类名/类型描述符:
int[]的类名是[I
int[][]的类名是[[I
Object[]的类名是[Ljava/lang/Object;; 注意封号也包括
String[][]的类名是[[java/lang/String

创建普通对象由new指令,然后由构造函数初始化。数组:

  • newarray指令: 基本类型 new int[10];
arrClass =classLoader.loadClass(covert2ArrayClassName(来自操作数的基础类型码));
arrObject = arrClass.newArray(arrayLength是stack弹出的);
stack.push(arrObject );
  • anewarray指令: 引用类型
componentClass = frame.method.class.runtimeConstantPool.constant(操作数)).resolveClass();
arrClass = componentClass.arrayClass();
arrObject  = arrClass.newArray(arrayLength是stack弹出的);
stack.push(arrObject );
  • multianewarray指令: 多维数组
//注意 :运行时场常量池拿到的就是数组类
arrayClass  = frame.method.class.runtimeConstantPool.constant(操作数)).resolveClass();
lens[]= stack.pop(维度个正数 维度数来自第二个操作数) 
arrObject= 递归创建多维数组(lens, arrayClass);
operandStack.push(arrObject);

例如:
public void test() {
int[][][] x = new int[3][4][5];
}
维度是3,弹出3个数:3 4 5

存取
普通对象中存放的是实例变量,通过putfield和getfield指令存取。
数组对象中存放的则是数组元素,通过aloadastore系列指令按索引存取。其中可以是a、b、c、d、f、i、l或者s,
另外,还有一个arraylength指令,用于获取数组长度。

  • aload系列指令
    stack.push(stack.pop2[stack.pop1]) 第二份pop的是数组
  • astore系列指令
    pop3[pop2]=pop1 第三个弹出的是数组
  • arraylength指令
    stack.push(pop.length) 弹出数组 得它的length 再入栈

8条指令的作用:

public class ArrayDemo {
  public static void main(String[] args) {
    int[] a1 = new int[10]; // newarray
    String[] a2 = new String[10]; // anewarray
    int[][] a3 = new int[10][10]; // multianewarray
    int x = a1.length; // arraylength
    a1[0] = 100; // iastore
    int y = a1[0]; // iaload
    a2[0] = "abc"; // aastore
    String s = a2[0]; // aaload
  }
}

数组强转

  • 数组可以强制转换成Object,Cloneable和Serializable类型(因为数组实
    现了这两个接口)。
  • 同为数组时
    成员 可以强转

你可能感兴趣的:(第8章 1.数组)