欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java基础之引用数据类型

程序员文章站 2024-03-23 14:20:34
...

引用数据类型

 

概念

在上一篇博客介绍了java中八种的基本数据类型,而除了基本类型之外,java中常见的还有诸如像String,Interger,Double或者其他自定义的类型,此种类型统称为引用数据类型,简单点来说,在java种,除了八种基本数据类型以外,其他的类型均统称为引用数据类型。在了解引用类型之前,我们先来介绍最基础的引用类型之包装类型。

包装数据类型

Java 设计当初就提供了 8 种 基本数据类型及对应的 8 种包装数据类型。我们知道 Java 是一种面向对象编程的高级语言,所以包装类型正是为了解决基本数据类型无法面向对象编程所提供的,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

java中把八种基本数据类型进行了封装,这八个封装类称为基本数据类型的八种包装类型,分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean。

下面是基本类型和对应的包装类型

基本类型 包装类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

基本类型和包装类型的区别

  1. 声明方式不同:基本类型不使用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间。
  2. 存储方式及位置不同: 基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用。
  3. 初始值不同:基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null。
  4. 使用方式不同: 基本类型直接赋值直接使用就好,而包装类型在集合如Collection、Map时会使用到。

自动装箱和拆箱

Java 5 增加了自动装箱、拆箱机制,提供基本数据类型和包装类型的相互转换操作。

装箱是将基本类型转换为包装类型,拆箱则是一个逆向过程,将包装类型拆成基本类型。

装箱

public static void main(String[] args) {
        int i = 1;  // 声明基本类型
        Integer i1 = Integer.valueOf(i);  // 装箱,转换成包装类型
    }

拆箱

public static void main(String[] args) {
        Integer i = 1;  // 声明Integer包装类
        int i1 = i.intValue();  // 拆箱成int基本类型
    }

这里都是调用Integer对象的valueOf和intValue方法来实现装拆箱,那么何时发生自动装拆箱呢?请看下面代码

自动装拆箱

public static void main(String[] args) {
        Integer i = 10;  // 自动装箱
        int i1 = new Integer(1);  // 自动拆箱
    }

上述代码,在声明包装类型Integer的时候,直接赋值基本类型int,此时会发生自动装箱,将10包装成引用类型后赋值给变量i,而声明基本类型i1时,将包装类赋值给i1,此时发生的是自动拆箱,将Integer(1)拆成了int后,赋值给变量i1。

引用类型介绍

上面了解了包装类型以及自动装拆箱,大概知道了包装类型拥有自己的属性和方法,那么除了基本类型以外,几乎所有的其他类型都拥有自己的属性以及方法,那么这种类型我们就称它为引用类型

当声明一个变量为引用类型后,将一个实例赋值给该变量,java虚拟机会在堆内存中创建实例,在栈内存中存储变量本身,后给一个引用(类似指针的概念),将变量指向该实例。而声明一个变量为基本类型后,变量和基本类型本身(比如说1)都会存放在栈内存中。

java中四类引用类型

从JDK1.2开始,Java中的引用类型分为四种,分别是:

  • 强引用(StrongReference)

当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了。如果一个对象具有强引用,JVM就不会去GC它,JVM宁可会报OOM来终止程序,也不回收该对象。

  • 软引用(SoftRefernce)

如果一个对象只具备软引用,如果内存空间足够,那么JVM就不会GC它,如果内存空间不足了,就会GC该对象。

  • 弱引用(WeakReference)

如果一个对象只具有弱引用,只要JVM的GC线程检测到了,就会立即回收。弱引用的生命周期要比软引用短很多。不过,如果垃圾回收器是一个优先级很低的线程,也不一定会很快就会释放掉软引用的内存。

  • 虚引用(PhantomReference)

如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当作垃圾进行GC。

 

这里说的比较抽象,因为涉及到java内存相关的知识,暂且关于引用类型的知识就介绍到这里,后续有时间会再进行更深入的讨论。