Hello,大家好,我是Steafan,今天我们来谈谈Java中的引用类型。

    众所周知,在普遍的编程语言中不单单是Java中,都存在着各种各样的变量类型,常见的有int,float,double,String等等,在上述提到的类型中,String类型作为一个“反例”,看似很不合群的存在于程序语言的世界中。在面向过程的语言中(以C语言为例),很少被提到字符串,最多被提到的是字符,如果想要在C语言中使用字符串,那么就需要将这些字符放到一个数组中,即使这样它也“逃脱”不了Char这种类型;而在面向对象的语言中(以Java为例),如果需要使用字符串只需String一下就可以了。

    我们前言以String为引子,引出在Java世界中存在的各种对象类别。

    熟练使用Java语言的程序员应该清楚,当我们在用Java开发业务的时候不可能逃脱“new”关键字的使用,而有很多程序员只会使用对象却不知道对象内部的运行原理,如果我们一直这样下去,那就只能做一名扎扎实实的“码农”了。此篇文章主要向大家介绍Java中的引用类型(对象类型)在Java虚拟机中的底层运行原理,同时也是我自身的一个总结,希望能尽可能多的帮到各位。

   在Java语言刚刚诞生的时候,对对象的分类并没有那么具体。在使用Java进行业务开发的时候,随着时代的发展,随着业务需求变得更加复杂,初始的对象类型已经无法满足开发者的需要,针对这一问题,Java在JDK1.2将对象这一类型进行了扩充,这一扩充使Java语言的主导地位变得更加稳固,同时越来越多的程序员也转向了Java的阵营中。

   在JDK1.2中,Java将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用或幽灵引用(Phantom Reference),这四种引用关系依次逐渐减弱。接下来我会结合Java虚拟机及Java GC机制分别对这四种类型进行介绍。

(1)、强引用:在Java程序中普遍存在,即当我们使用new关键字创建一个对象时就可以称该对象为一个强引用对象,对于这种强引用对象,只要其还存在,垃圾收集器永远不会回收该对象。

(2)、软引用:在Java程序中那些还有用但不是必须的对象被成为弱引用,对于这种弱引用,只有在当即将发生内存溢出异常之前,垃圾收集器才会对其进行回收,否则不对她进行垃圾回收处理。如果在垃圾收集器回收了软引用之后内存依旧不足,此时才会报内存溢出异常。

(3)、弱引用:在Java程序中那些非必须的对象被称为弱引用,对于这种弱引用,在垃圾收集器进行垃圾收集前存活,一旦垃圾收集器开始垃圾回收工作,无论内存是否足够,弱引用当将被回收。

(4)、虚引用:在Java程序中,除了上述三种类别之外的引用类别都是虚引用,虚引用的存在不会影响其本身的存活时间,也不能通过虚引用来取得对象的实例。为一个对象设置虚引用关联的唯一目的就是在垃圾回收器将其回收时会收到系统的回收通知。