析构方法与构造方法相反,当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构方法。析构方法往往用来做清理垃圾碎片的工作,例如在建立对象时用 new 开辟了一片内存空间,应退出前在析构方法中将其释放。

在 Java 的 Object 类中还提供了一个 protected 类型的 finalize() 方法,因此任何 Java 类都可以覆盖这个方法,在这个方法中进行释放对象所占有的相关资源的操作。

对象的 finalize() 方法具有如下特点:垃圾回收器是否会执行该方法以及何时执行该方法,都是不确定的。

finalize() 方法有可能使用对象复活,使对象恢复到可触及状态。

垃圾回收器在执行 finalize() 方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行。

例如:

protected void finalize()

{

//对象的清理工作}

例 1

下面通过一个例子来讲解析构方法的使用。该例子计算从类中实例化对象的个数。

(1) Counter 类在构造方法中增值,在析构方法中减值。如下所示为计数器类 Counter 的代码:

public class Counter

{

private static int count=0; //计数器变量

public Counter()

{

//构造方法

this.count++; //创建实例时增加值

}

public int getCount()

{

//获取计数器的值

return this.count;

}

protected void finalize()

{

//析构方法

this.count--; //实例销毁时减少值

System.out.println("对象销毁");

}

}

(2) 创建一个带 main() 的 TestCounter 类对计数器进行测试,示例代码如下:

public class TestCounter

{

public static void main(String[] args)

{

Counter cnt1=new Counter(); //建立第一个实例

System.out.println("数量:"+cnt1.getCount()); //输出1

Counter cnt2=new Counter(); //建立第二个实例

System.out.println("数量:"+cnt2.getCount()); //输出2

cnt2=null; //销毁实例2

try

{

System.gc(); //清理内存

Thread.currentThread().sleep(1000); //延时1000毫秒

System.out.println("数量:"+cnt1.getCount()); //输出1

}

catch(InterruptedException e)

{

e.printStackTrace();

}

}

}

执行后输出结果如下:

数量:1

数量:2

对象销毁

数量:1

技巧:由于 finalize() 方法的不确定性,所以在程序中可以调用 System.gc() 或者 Runtime.gc() 方法提示垃圾回收器尽快执行垃圾回收操作。

java析构_Java析构方法相关推荐

  1. java content()_Java contentEquals() 方法 - Break易站

    Java contentEquals() 方法 Java String类 contentEquals() 方法用于将此字符串与指定的 StringBuffer 比较. 语法 public boolea ...

  2. java 类型参数_java – 通用方法类型参数

    您的两个问题都可以通过以下方式解答:这是Java语法.在Java语言中,参数化方法声明如下: [optional modifiers] [return type] foo() {} 它声明了一个名为T ...

  3. java replace( . )_Java replace() 方法

    Java replace() 方法 Java String类 replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串. 语法 publ ...

  4. JAVA min()_Java min()方法

    Java min()方法 min() 方法用于返回两个参数中的最小值. 语法 该方法有以下几种语法格式: double min(double arg1, double arg2) float min( ...

  5. java 参数传递_java中方法的参数传递机制

    无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些.闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递. 这里的内存模型涉及到 ...

  6. java content()_Java contentEquals() 方法

    全屏 Java contentEquals() 方法 contentEquals() 方法用于将将此字符串与指定的 StringBuffer 比较. 语法public boolean contentE ...

  7. 类与方法java讲解_Java中方法使用的深入讲解

    方法的使用 1.方法的基本用法 什么是方法,方法就是一个代码片段,类似于c/c++ 语言中的"函数". 1.1方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候). ...

  8. java 正切_Java tan()方法

    Java tan()方法 tan() 方法用于返回指定double类型参数的正切值. 语法 doubletan(doubled) 参数 d -- 任何原生数据类型. 返回值 返回指定double类型参 ...

  9. java起名_java命名方法 | 学步园

    Java命名方法 1.骆驼(Camel)命名法:第一个字母小写,随后的每个单词的第一个字母大写.如:studentName 2.帕斯卡(Pascal)命名法:每一个单词的第一个字母都大写.如:Stud ...

最新文章

  1. icem密度盒怎么设置_icem一些总结精编版
  2. 清理XCode无用的文件(转)
  3. 引用类型的转换 java,java中引用类型的强制转换
  4. 分形(Fractal)
  5. 2021年,Java开发者值得学习的13项技能
  6. 开发指南专题三:JEECG微云快速开发平台项目编码规范
  7. Deploy简单配置记录
  8. 笔记本电脑怎么录制屏幕
  9. linux 安全狗 乱码,打狗棒法之:Cknife(C刀)自定义模式秒过安全狗
  10. SEM和SEO的区别?
  11. word排版遇到的问题
  12. html 打开资源管理器,资源管理器怎么打开 教你如何快速打开资源管理器
  13. TypeScript介绍
  14. STM32 ADC多通道采样声音传感器和环境光传感器
  15. 基于核的黎曼编码和字典学习
  16. 如何在Google文档中添加文本框
  17. C#实现Modbus协议与PLC通信
  18. opencv 白平衡之灰度世界算法
  19. MacVim中文乱码解决
  20. CCF-GAIR 2020 源创专场 | 免费领取学术票

热门文章

  1. AndroidStudio编译失败:Could not initialize class com.android.repository.api.RepoManager
  2. ViewFlipper和ViewPager,fluttertextfield高度
  3. 如何用Python打电话来播放一段语音
  4. 神经网络与深度学习(三)——反向传播算法
  5. 史上最快的刷迅雷积分的文件(推荐)
  6. FormulA基金会理事子谦:未来99%的资产都将登记在区块链上
  7. 基于数据分析的智能饮食推荐APP含菜品识别
  8. 第六节 悬索桥结构体系的演变
  9. Java--获取属性(System.getProperty)--方法/实例
  10. 新东方旗下公司被曝禁止员工午休,CEO公开道歉被前员工大连!