第15章 对象和数组
在java虚拟机中,内存只能以对象形式在垃圾收集堆中分配。除非作为对象的一部分,否则不能为基本类型分配内存。如果需要在必须使用对象引用的场合使用基本类型,可以从java.lang包中的为基本类型分配一个包装器对象。只有对象引用和基本类型可以在java栈中以局部变量形式存在,java栈不能容纳对象。
java虚拟机中的对象和基本类型的结构分离在java语言中体现为:对象不能作为局部变量声明,只有对象引用和基本类型可以。对象引用在声明后并不指向任何有意义的东西,只有引用在被显式初始化后,对象引用才会指向一个真实的对象。
在java虚拟机指令集中,除了数组外,所有的对象都使用同样的操作码来实例化和存取。java中的数组是完善(full-fledged)的对象,和其他对象一样,数组是动态创建的,数组引用可以在任何需要用到引用来标识对象的地方使用,数组中对象的任何方法都可以被调用,但java虚拟机中仍然使用特殊的字节码来处理数组。如同其他对象,数组不能作为局部变量来使用,只有数组引用可以;数组对象本身通常包括基本类型数组和对象引用数组。如果声明了对象数组,数组中的成员必须通过new操作显式创建。
对象的操作码:
对象创建:实例化一个新对象需要通过new操作码来实现,new操作码后面紧随着两个字节的操作数,这两个字节的操作数合起来表示常量池中的一个不带符号的16位长度的索引。在特定偏移量位置的常量池入口给出了新对象所属的类型的信息。它会为这个堆中的对象(Class代表的类型数据)建立一个新的实例,用默认初始值初始化对象实例变量,然后把新对象的引用压入栈。
对象实例变量存取:putfield和getfield操作码只在字段是实例变量的情况下才执行。putfield和getfield指令都有两个操作数,这两个操作数合起来表示常量池中的不带符号的16位索引长度的索引。设个索引指向的常量池入口包含了该字段的所属类、名字和类型等信息。putfield和getfield对对象引用进行栈操作,putfield从栈中取出实例变量值,getfield把获得的实例变量值压入栈。
类变量存取:getstatic和putstatic操作码进行类变量存取操作。因为没有任何特定的对象与静态字段相关,所以getstatic和putstatic不会使用对象引用。
类型检验:
checkcast操作码判断栈中的对象引用是否是指定索引位置处的类或者接口的实例,如果不是,checkcast抛出一个CheckCastException异常;否则任何事情都不会发生,对象引用仍在栈中,下一条指令会接着执行。checkcast确保运行时类型转换的安全,是java虚拟机安全框架的组成部分。
instanceof操作码从栈顶弹出对象引用,如果对象是指定索引位置处的类或者接口的实例,就向栈中压入1,否则压入0。
数组操作码:实例化新数组可以通过newarray、anewarray和multianewarray操作码完成。
newarray用来创建基本类型数组。基本类型由紧随newarray的单字节操作数atype指定,newarray能够创建byte、short、char、int、long、float、double和boolean类型的数组。
当数组类型显式声明为boolean时,java虚拟机中创建数组的指令会以位为单位进行操作。在这种表示方法中,一个数组的每个boolean元素都可以使用1位来表示;当内存不是很紧张时,boolean数组可以使用byte数组的方式实现。无论虚拟机使用哪一种实现,都会使用存取byte数组元素的操作码访问boolean数组的元素。
anewarray用来创建对象引用数组。这条指令为对象引用数组分配空间,并把数组成员的引用值初始化为null。
multianewarray指令用来分配多维数组,所谓多维数组,就是数组的数组。多维数组也可以通过重复使用anewarray和newarray来进行分配。multianewarray指令只不过把创建多维数组的指令所需要的字节码压缩到一条指令中。
arraylength从栈顶弹出一个数组引用,然后把这个数组的长度压入栈。
获取数组元素:虚拟机从栈中弹出数组的索引和数组引用,再将位于给定数组的指定索引位置的值压入栈。操作byte、boolean、short时,通过符号扩展转换为int类型的值,操作char时,通过零扩展转换为int类型的值,然后把int值压入栈。
设置数组元素:从栈中弹出要设置的值、索引和数组引用,byte、boolean只存储弹出yint类型值得低8位;short、char值只存储弹出int类型值得低16位;其他高位被直接丢弃。
相关推荐
深入理解 Java 虚拟机笔记 Java 虚拟机(JVM)是 Java 语言的运行环境,它负责解释和执行 Java 字节码。下面是 Java 虚拟机相关的知识点: 虚拟机内存结构 Java 虚拟机的内存结构主要包括以下几个部分: * 方法...
所有类的实例和数组都是在堆上分配内存的,堆内存由存活和死亡的对象、空闲碎片区组成,对象所占的堆内存是由自动内存管理系统回收。 方法区是 JVM 中的一个非常重要的区域,用于存储已被 JVM 加载的类信息,包括类...
- **功能**: 存储所有由new关键字创建的对象和数组。 - **生命周期**: 对象的整个生命周期。 - **垃圾回收**: 是主要的垃圾回收区域。 - **结构**: - **新生代**: 包括Eden区、Survivor S0和Survivor S1。新创建的...
### 学习笔记之Java虚拟机详解 #### 运行时数据区域概览 Java虚拟机(JVM)运行时数据区域主要包括以下几部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。 1. **程序计数器**: -...
1. **主内存**:所有线程共享的区域,存放所有的对象实例和数组。 2. **工作内存**:每个线程私有的工作区,存放线程运行过程中需要用到的变量副本。 3. **锁记录**:用于实现线程间的同步。 4. **程序计数器**:...
堆是所有线程共享的内存区域,主要用于存放对象实例和数组。它被进一步划分为新生代和老年代,以优化垃圾收集效率。新生代又细分为Eden空间、From Survivor空间和To Survivor空间。 - **新生代**: 主要用于存放新...
堆内存是 JVM 中的最大内存区,它用于存储 Java 对象和数组。栈内存是线程私有的,它用于存储方法调用和局部变量。方法区是用于存储类信息、常量池等。程序计数器是用于存储当前执行的字节码指令。 3. 堆内存 堆...
而引用类型则涉及对象,如类、接口和数组,它们存储的是对象的内存地址,而不是实际的对象值。 对象是Java面向对象特性的重要组成部分。对象是类的实例,它们具有状态(由属性或字段表示)和行为(由方法表示)。...
基本类型包括整型、浮点型、字符型和布尔型,而引用类型主要指的是类、接口和数组。变量是存储数据的容器,理解它们的声明、初始化和使用是编写任何Java程序的基础。 "JAVA面向对象编程(孙卫琴)_3java操作符1.doc...
2. **数据类型**:Java分为基本数据类型(如整型、浮点型、字符型和布尔型)和引用数据类型(如类、接口和数组)。理解它们的区别和应用场景至关重要。 3. **控制流**:包括条件语句(if-else, switch-case)和循环...
除此之外,还有引用数据类型,如类、接口和数组。变量是存储值的容器,必须先声明数据类型再赋值。 【运算符与控制结构】 Java支持算术运算符(+、-、*、/、%)、关系运算符(==、!=、<、>、、>=)、逻辑运算符(&...
堆用于存储创建好的对象和数组,是一个不连续的内存空间。方法区用于存储类、常量相关的信息,是一个共享的区域。 栈 栈的特点包括: * 栈描述的是方法执行的内存模型 * 每个方法被调用都会创建一个栈帧 * 栈属于...
2. **八种基本数据类型**:Java有两大类数据类型,基本类型(如int、char、boolean)和引用类型(如类、接口和数组)。基本类型是不可变的,而引用类型可以指向对象。 3. **常量和变量**:常量是固定不变的值,可以...
- Java中的变量类型包括基本数据类型(如整型、浮点型、字符型、布尔型)和引用数据类型(如类、接口和数组)。 6. **JAVA变量类型** - 基本数据类型包括整型(如`byte`、`short`、`int`、`long`)、浮点型(`...
3. **基础语法**:Java语言的基础包括数据类型(如整型、浮点型、字符型和布尔型)、变量、常量、运算符、控制流程(如if-else、switch-case、for、while、do-while循环)和数组。 4. **类与对象**:面向对象是Java...
本节的听课笔记将深入探讨Java的核心概念和技术。 一、Java语言基础 1. 变量与数据类型:Java提供了基本数据类型(如int、float、char等)以及引用数据类型(如类、接口和数组)。变量是存储数据的容器,必须先...
学习Java时,理解基本类型(如int、boolean)、引用类型(如类、接口)和数组的使用至关重要。此外,异常处理(try-catch-finally块)也是Java程序中常见的错误管理机制。 Java标准库提供了丰富的API,如集合框架...
在Java中,JVM也需要管理虚拟内存,包括堆内存(用于对象和数组)、栈内存(用于方法调用)以及方法区(存储类信息)。堆内存是JVM内存管理的主要部分,它在所有线程之间共享,而栈内存则为每个线程单独分配。虚拟机...
- 引用数据类型包括类、接口和数组。 7. 类型转换: - 自动类型转换是从低精度到高精度,例如int到long。 - 强制类型转换是将高精度到低精度,需要注意精度损失。 8. Java技术架构: - J2EE(Java 2 ...