释放对象的引用

一个局部变量的生命周期只存在于其自身类中。如下的例子可以发现,局部变量只能存在于声明该变量的方法中。

public class TestLifeOne {
    public void  read() {
        int s=42;        //s只能限于read()中使用,别处无法使用
        sleep();
    }
    public void sleep() {
        s=7;    //s在此处无法使用
    }

}

对于实例变量,其寿命与对象的寿命相同。对象未“死”,实例变量也未“死”。

public class TestLifeOne {

    int size;

    public void sleep(int s) {
        size=s;     //s会在方法结束时消失,但是size在类TestLifeOne中处处可以使用。
    }

}

引用变量如果活着,那么对象也会活着,当对对象的引用死了,那么该对象也会从堆上被踢开,变成垃圾被垃圾收集器(GC)所回收。

有三种方法释放对象的引用,当最后一个引用消失时,对象就会变成可回收的。

 1     void go() {        //引用永久性地离开它的范围
 2         Life z=new Life();  //z会在方法结束时消失
 3     }
 4
 5     //引用z被赋值到其他对象上时
 6     Life z=new Life();
 7     z=new Life();        //此处,第一个Life对象会在z被赋值到别处时消失
 8
 9     //直接将引用z设定为null
10     Life z=new Life();
11     z=null;                //此处,第一个Life对象在z被赋值为null时消失

在如下代码中插入一条代码,会有哪些是使某一个额外对象被认为是可以垃圾回收的?

    GC gc1;
    GC gc2=new GC();
    GC gc3=new GC();
    GC gc4=gc3;
    gc1=new GC();

    //在上述代码下加入以下一行代码,会使一个额外的对象被认为是可回收的垃圾吗?
    gc2=null;          //会,gc2是唯一引用,因此其对象会被回收
    gc1=null;        //同上
    gc4=null;        //不会,还有gc3引用gc4的对象,因此不会被回收
    gc3=gc2;        //不会,还有gc4引用gc3的对象,因此不会被回收
    gc1=gc4;        //会,重新给对象引用赋值
    gc3=null;        //不会,gc4还在引用该对象

这个要想通其实画一个对象引用的箭头图就能明白了。

原文地址:https://www.cnblogs.com/do-hardworking/p/10468288.html

时间: 2024-10-11 02:07:29

释放对象的引用的相关文章

JavaSE8基础 释放对象的引用 指向新对象或赋值为null

礼悟:    好好学习多思考,尊师重道存感恩.叶见寻根三二一,江河湖海同一体.          虚怀若谷良心主,愿行无悔给最苦.读书锻炼强身心,诚劝且行且珍惜. jdk:jdk-8u131-windows-x64             os:windows7 x64            ide:MyEclipse 2017 Javaer类的代码 package jizuiku.demo; /** * * * @author 给最苦 * @version V17.11.05 */ publi

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):当函数返回一个局部对象时,虽然这个对象已经释放,但是返回时会产生一个临时的对象.而当返回一个局部对象的引用时,这个对象已经不存在了.这就要求在函数参数中,包含一个引用或指针.int &func(int a,int b,int &retsult){ retsult = a + b; return &retsult}但是如下代码是错误的(返回局部对象的引用)int &func(int a,int b){ int &

不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, const 对象的引用 作者:webabcd 介绍不可或缺 Windows Native 之 C++ this 指针 对象数组 对象和指针 const 对象 const 指针和指向 const 对象的指针 const 对象的引用 示例1.CppEmployee 类CppEmployee.h #pragma

Python 对象的引用计数和拷贝

Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己,可通过内建函数id(obj)查看. 2.type,对象的类型决定了该对象可以保存什么类型的值,可用内建函数type(obj)查看: 3.value,即对象的值. 下面是一个例子: >>> str = "hello world" >>> type(str

Java 面向对象:类、对象、引用

FighterPlane fp = new FighterPlane() 先产生对象,然后赋予声明 fp new FighterPlane() 根据类模板产生一个对象,并在内存中为此对象开辟一块独立的内存空间. 以类为模板产生对象,实质上就是将类中定义的属性(域变量)复制到对象中,这些属性(域变量)虽然是在类中定义的,但实际上是为对象服务,因而称它们为对象属性. 方法在调用时,系统会为方法开辟一个栈空间,用于存放方法中的形式参数和局部变量. 方法在执行时还能访问复制到对象中的域变量,就如同方法也

第九节(对象和引用)

Java把内存划分成两种:一种是栈内存,一种是堆内存 一. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所 分配的内存空间,该内存空间可以立即被另作他用. 二. 堆内存用来存放由new创建的对象和数组.在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同

c++返回函数局部对象的引用

    函数千万不要返回局部对象的引用或指针 局部变量在函数里面,当函数执行结束后将释放局部变量,如果返回引用或批针这个时候引用或指针指向所指向的内存空间已经释放.指针和引用将是垂悬指针.很危险! 但是如果返回的"局部变量"是堆中的内存值就可以返回了 C++函数为什么要使用引用? C语言之中大量利用指针作为形参或者函数返回值,这是由于值拷贝会有很大的消耗(比如传入传出一个大的结构体).所以在C++之中使用引用作为函数参数和返回值的目的和使用指针是一样的.而且形式上更加直观,所以C++提

COM对象除了引用计数还有...

COM对象除了引用计数还有… 一.   背景: VideoManager支持实时, 需要同时传入一组窗口的设备信息和StreamerID, 并且传入之后需要设置给相对应的VideoView. 所以在VideoManager实现了IDeviceInfo的COM对象, 包含三个成员分别是IVideoView* video_view, GUID streamer_id, IDeviceConfig* device_config. C#的调用如下 var list_deviceInfo = new Li

对象的引用计数

在OC中所有的引用类型都被声明为指针类型,指针类型在内存中占用若干地址空间,如果对象的内存使用不当,则会造成内存溢出,甚至程序崩溃的严重后果. 在其他语言中有内存自动回收的, 例如:Java语言,自动释放的. 手动管理内存:C++ , OC 2.0之前. 在OC 2.0之后,提供了内存自动个管理机制ARC,我们很少关系内存管理,但是了解内存内管是必要的! 在OC中如何判断一个对象何时分配内存,有何时释放内存呢? OC提供了对象的引用计数法则. 对于每个对象都有一个retainCount属性,当属