关闭

Java中的引用

标签: Java引用引用与指针
201人阅读 评论(0) 收藏 举报
分类:

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,即不能获得原对象
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49307次
    • 积分:876
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:2篇
    • 译文:0篇
    • 评论:6条
    博客专栏
    最新评论