Java中的引用

原创 2016年08月31日 19:19:54

Java中的引用

1.什么是引用?

引用就是一个地址,对象寻址地址,通过它可以找到所指向的对象:

ClassA o = new ClassA();//o就是一个引用,指向对象new ClassA()

要注意引用和对象并不是同一个东西,引用是存在栈中,对象存在堆中,以上一行代码可以拆解成以下两行代码理解:

ClassA o;//声明一个ClassA类型引用o,这个时候JVM会在栈中申请一个引用大小(4字
//节)的内存存储o,但这个时候其上内容无意义,你也不能使用o做什么,否则编译器报错
//指出,o未初始化
o = new ClassA();//new才是用来在堆上申请空间存储一个新的ClassA对象,然后用o指向它

2.Java引用与指针的区别

最大的区别:指针可以直接操控内存,而引用不行;说的简单点,就是指针可以计算,而引用不行:

//指针
ClassA *p = new ClassA();//这个时候,p可以这样操作
p = p + 1;//指向内存的下一个单元地址,不止是加,其他运算也可以
//这种做法,很危险,因为开发人员不小心的话,p就会指向不属于该程序的内存,造成越界
//Java引用则不能这样操作运算

他们的作用实现类似,都是寻址地址,指向对象,其实Java引用就是封装了的指针,所以指针灵活,自由度更大,如果你清楚你的程序对象内存分布,完全可以通过一个指针操作程序所有内存数据(同一类型),而Java则不允许这样做,不过安全,不需要程序员关心具体内存的分布。

3.Java的四种引用

上面的的引用o其实只是Java中常见的一种引用——强引用,Java还有其他三种引用:弱引用、软引用以及虚引用。引用的分类主要是为了便于垃圾回收器回收对象(垃圾回收机制可以参考:Java GC概述),当然还有其他一些作用。
Java引用类目录:
java.lang.Object
  ——java.lang.ref.Reference(引用抽象基类)
    ——java.lang.ref.SoftReference(软引用)
    ——java.lang.ref.WeakReference(弱引用)
    ——java.lang.ref.PhantomReference(虚引用)
  ——java.lang.ref.ReferenceQueue(引用队列)
1. 强引用:就是常用的引用,使用“new+类名”创建对象,其引用就是一个强引用,垃圾回收器是不会回收具有强引用的对象的,哪怕内存不足,JVM宁可抛异常也不会回收具有强引用的对象的内存。
2. 软引用:当内存空间不足(正常情况下要发生OutOfMemory的时候),JVM会回收具有软引用的对象(当然前提是这个对象不具有另一个强引用),软引用可用来实现内存敏感的高速缓存。关于软引用可参考百度文库:Java软引用
3. 弱引用:只要被垃圾回收器发现扫描到就会回收这类对象。
4. 虚引用:只具有虚引用的对象,就和没引用一样(既不能通过虚引用获得引用对象),使用虚引用主要是为了跟踪对象,在其被回收时候返回一个消息,所以虚引用必须配合引用队列使用。

ClassA a = new ClassA();//对象new ClassA()这里称为x
ReferenceQueue rq = new ReferenceQueue();//引用队列
//1.软引用
SoftReference<ClassA> softO = new SoftReference<ClassA>(a[,rq]);
//垃圾回收器回收软/弱引用对象,会自动将对象追加到引用队列尾,引用队列主要配合GC使用
a = null;//这个时候对象x才仅具有软引用softO
ClassA a1 = softO.get();//重新获得对象x的强引用
//注意,除了强引用,其他三个引用并不能调用原对象的方法
//弱引用的使用方法同软引用
//虚引用,必须使用引用队列,即只有以下构造方法:
PhantomReference prO = new PhantomReference(a,rq);
//而且,虚引用的get()方法重写了,固定返回null,即不能获得原对象
版权声明:本文为博主原创文章,未经博主允许不得转载。

java中对象创建、初始化、引用

  • 2012年02月27日 13:36
  • 43KB
  • 下载

java函数引用图解

  • 2013年08月16日 17:08
  • 226KB
  • 下载

DOS环境下含包并引用第三方jar的java程序的编译及运行

DOS环境下含包并引用第三方jar的java程序的编译及运行,在Linux系统的命令行下也适用。   1、程序目录机构       bin:class文件生成目录 lib:第三方jar包目录 src:...
  • Mirale
  • Mirale
  • 2014年03月26日 16:10
  • 901

Android 开发工具学习之 配置构建路径(configure build path)、更改系统库、添加引用的库(Java和Android)

从别人那复制过来的project,由于使用的JDK版本(Android版本)不同,导入后也许会造成代码出错,这时就需要配置构建路径了。 现象:工程的包上会出现红色的感叹号 一、JDK系统库...

java org.common 开发,引用

  • 2017年10月31日 10:48
  • 2.55MB
  • 下载

java对象引用易混解析

  • 2016年02月29日 13:44
  • 28KB
  • 下载

java8 函数引用 -> 一种利用现有函数简单推理为函数表达式即简化的函数表达式

java8 函数引用 -> 一种利用现有函数简单推理为函数表达式即简化的函数表达式...

Java BLL 引用 适用于 vs2003-vs2012

  • 2013年07月29日 11:01
  • 20KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的引用
举报原因:
原因补充:

(最多只允许输入30个字)