一、对象创立与拜访指令的概述


Java是面向对象的程序设计语言,虚拟机平台从字节码层面就对面向对象做了深层次的反对。有一系列指令专门用于对象操作,可进一步细分为创立指令、字段拜访批令、数组操作指令、类型查看指令

二、创立指令


尽管类实例和数组都是对象,但ava虚拟机对类实例和数组的创立与操作应用了不同的字节码指令:

创立类实例的指令:
  • 创立类实例的指令: new
  • 它接管一个操作数为指向Q量池的索引,示意要创立的类型,执行实现后,将对象的援用压入栈
创立数组的指令:
  • 创立数组的指令: newarray、 anewarray、multianewarrayc
  • newarray:创立根本类型数组
  • anewarray:创立援用类型数组
  • multianewarray:创立多维数组

上述创立指令能够用于创建对象或者数组

并且因为对象和数组在Java中的宽泛应用,这些指令的应用频率也十分高

接下来咱们针对于创立类的指令的根本测试,请看以下示例代码

public class NewTest{     //1.创立指令    public void newInstance(){            Object obj = new Object();        File file = new File("atguigu.avi");    }}

接下来咱们编译该代码,看看办法的字节码是用什么指令进行对象创立的?

接下来咱们依据字节码指令进行图示解析剖析,具体做了哪些操作?




接下来咱们针对于创立类的指令的根本测试,请看以下示例代码

public class NewTest{         public void newArray() i        int[] intArray = new int[10];        Object[] objArray = new Object[10];        int[][]mintArray = new int[10][10];        String[][] strArray = new String[10][];    }}

接下来咱们编译该代码,看看办法的字节码是用什么指令进行对象创立的?

三、字段拜访指令


对象创立后,就能够通过对象拜访指令获取对象实例或数组实例中的字段或者数组元素。

  • 拜访类字段(static字段,或者称为类变量)的指令: getstatic、putstatic
  • 拜访类实例字段(非static字段,或者称为实例变量)的指令: getfield、putfield

以getstatic指令为例它含有一个操作数,为指向常量池的Fieldref索引。

它的作用就是获取Fieldref指定的对象或者值,并将其压入操作数栈。

接下来咱们针对于字段拜访的指令的根本测试,请看以下示例代码

public class NewTest{         //2.字段拜访指令    public void sayHello(){        system.out.print1n("hello");    }}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?




接下来咱们联合后面的创建对象指令与字段拜访指令,看看又是怎么样的成果?

public class NewTest{         public void setorderId(){        order order = new Order();        order.id = 1001;        System.out.println(order.id);    I        order.name = "ORDER";        System.out.println(order.name);    }}class order{    int id;    static string name;}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?

接下来咱们依据字节码指令进行图示解析剖析,具体做了哪些操作?




四、数组操作指令


数组操作指令次要有: xastore和xaload指令。具体为:

把一个数组元素加载到操作数栈的指令:

baload、caload、saload、iaload、laload、faload、daload、aaload

将一个操作数栈的值存储到数组元素中的指令:

bastore、castore、sastore、iastore、 lastore、fastore、dastore、aastore

取数组长度的指令:arraylength

该指令弹出栈顶的数组元素,获取数组的长度,将长度压入栈。

指令xaload示意将数组的元素压栈,比方saload、caload别离示意压入short数组和char数组

指令xaload在执行时要求操作数中栈顶元素为数组索引i,栈顶顺位第2个元素为数组援用a,该指令会弹出栈顶这两个元素,并将a[i]从新压入堆栈。

xastore则专门针对数组操作,以iastore为例,它用于给一个int数组的给定索引赋值。

在iastore执行前操作数栈顶须要以此筹备3个元素:值、索引、数组援用

iastore会弹出这3个值,并将值赋给数组中指定索引的地位。

接下来咱们针对于数组操作指令的根本测试,请看以下示例代码

public class NewTest{         //3.数组操作指令    public void setArray(){        int[] intArray = new int[10];        intArray[3] = 20;        System.out.println(intArray[1]);    }}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?



接下来咱们再针对于数组操作指令的根本测试,请看以下示例代码

public class NewTest{         / /3.数组操作指令    public void setArray(){        int[] intArray = new int[10];        intArray[3] = 20;        System.out.println(intArray[1]);                boolean[] arr = new boolean[10];        arr[1] = true;    }}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?

接下来咱们再针对于数组操作指令的根本测试,请看以下示例代码

public class NewTest{         public void arrLength( ){        double[ ] arr = new double[10];        system.out.println( arr.length);    }}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?

五、类型查找指令


查看类实例或数组类型的指令: instanceof、 checkcast

指令checkcast用于查看类型强制转换是否能够进行

如果能够进行那么checkcast指令不会扭转操作数栈,否则它会抛出C1asscastException异样。

指令instanceof用来判断给定对象是否是某一个类的实例,它会将判断后果压入操作数栈。

接下来咱们针对于类型查找指令的根本测试,请看以下示例代码

public class NewTest{         //4.类型查看指令    public String checkcast(Object obj){        if (obj instanceof String) {            return (String)obj;        }else{            return null;        }    }}

接下来咱们编译该代码,看看办法的字节码是用什么指令的?