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源码解析(附录)(1) —— ParameterizedType

Java类型之参数化类型源码public interface ParameterizedType extends Type { //1.获得<>中实际类型 Type[] getActu...

Type Java类型

Type —— Java类型  Type是一个空接口,所有类型的公共接口(父接口),其意义表示Java所有类型,这里所谓的类型是从Java整个语言角度来看的,比如原始类型、参数化类型(泛型)、类型变量...

Java源码解析(附录)(5) —— WildcardType

WildcardType 泛型表达式通配符表达式,泛型表达式,也可以说是,限定性的泛型,形如:? extends classA、?super classB。源码public interface Wil...

Java源码解析(附录)(2) —— TypeVariable

TypeVariable —— 类型变量  TypeVariable,类型变量,描述类型,表示泛指任意或相关一类类型,也可以说狭义上的泛型(泛指某一类类型),一般用大写字母作为变量,比如K、V、E等。...

synthetic Java合成类型

Synthetic  看Class源码的时候,看到有个关键字Synthetic以及isSynthetic()方法,遂有兴趣查阅了一番。   一开始以为,就是复合类型(引用类型),也就是非基本类型,可...

Java源码解析(3) —— Class(2)

Class 源码详解续(2) 关于Class,详见:Java源码解析(2) —— Class(1)。 源码 //如果该Class对象是本地类或匿名类,返回包含这个类的方法的信息(Meth...

Java 变量数据类型

Java 变量之变量数据类型Java数据类型图: 1.基本数据类型  基本数据类型,也称内置类型,是可以在栈直接分配内存的,Java保留基本数据类型最大的原因也在此:性能。关于这一点可以参考:Jav...

Java 内部类、成员类、局部类、匿名类等

Java各种称呼类详解Java有各种各样类,内部类、嵌套类、成员类、局部类(本地类)、静态类、匿名类、文件类以及这些组合起来的称呼类,成员内部类,成员匿名类,成员嵌套类,本地匿名类等,真是多的不行,但...

Java源码解析(4) —— Class(3)

@CallerSensitive public Class[] getDeclaredClasses() throws SecurityException { // be ve...

(3) Java内存结构

Java的运行时数据区,也就是Java的内存结构(Java Structure),但注意区分Java的内存模型(Java Memory Model,JMM),JMM现在我还没仔细去研究过,有兴趣的同学...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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