java的引用类型有哪些:分类与使用判断

java的引用类型有哪些,完整分为类、接口、数组、枚举、注解这五大类,引用类型变量存储的不是对象本身,而是堆内存对象的地址,赋值和传参时传递地址引用,修改引用指向对象的内部数据会影响所有持有该引用的变量,基础数据类型则直接保存原始值,该判定方式适用于JavaSE8及更高版本,不适用于基础类型包装类的自动拆装箱场景,自动拆装箱会在基础值与对象之间隐性转换,容易混淆引用行为。你在编码判断变量是否为引用类型时,只需要看变量对应的类型是否属于这五类,基础类型byte、short、int、long、float、double、char、boolean不属于引用类型。

java的引用类型:五大类型详解

类是最常用的引用类型,你编写的普通Java类、JDK自带的String、ArrayList等都属于类类型。当你new一个类实例时,堆中创建对象,栈内变量保存对象地址。同一个对象可以被多个引用变量指向,任意一个引用修改对象内部属性,其他引用读取到的属性都会同步变化。

接口本身不能直接实例化,只能由实现类创建对象,接口引用变量可以指向任意它的实现类实例。这个特性是多态的核心,接口引用只能调用接口内定义的方法,无法直接访问实现类新增的方法,强制类型转换后才可以访问,转换失败会抛出ClassCastException。

数组无论数组元素是基础类型还是引用类型,数组本身都属于引用类型。int[]数组存放int基础值,但数组对象本身在堆中,数组变量保存数组地址。数组引用重新赋值,只会改变引用指向,不会修改原有数组内存储的数据。

枚举是特殊的类,继承自Enum类,属于引用类型。枚举实例在程序运行期间只会预先创建固定数量对象,一般使用单例形式,枚举引用比较推荐用==,可以直接判断引用地址是否相同,效率高于equals方法。

注解作为元数据标记类型,属于引用类型。注解不会直接创建业务对象,主要在编译期或运行期保存标记信息,配合反射读取注解配置,日常业务开发中直接实例化注解的场景较少。

区分引用类型和基础类型。

类型类别内存存储内容赋值传递行为是否支持null赋值
引用类型堆对象地址传递地址,共享对象支持
基础数据类型原始数值传递值副本,互不影响不支持

包装类Integer、Boolean等属于类,是引用类型,自动装箱时会把基础值转为包装对象,自动拆箱把包装对象转回基础值。代码里写Integera=100,底层会调用Integer.valueOf(100)生成对象,缓存池范围内的数值会复用已有对象,超出缓存范围会新建对象,直接用==比较包装类变量容易出现不符合预期的结果,推荐使用equals做数值对比。

该判定规则的适用边界是,只针对标准Java语言规范,不包含JNI、JVM内部特殊对象、虚拟线程相关底层对象,这类底层对象的引用行为存在特殊处理,不能直接套用普通引用类型判断逻辑。

引用类型变量赋值为null,代表变量不指向任何堆对象,此时调用对象方法会抛出NullPointerException。你写代码时,可以提前做空判断,减少空指针异常的出现概率。

敬慕百科汇集百科知识与游戏文化,带你发现世界的每一个精彩角落。

想要了解更多关于java的引用类型有哪些的文章欢迎访问:百科