Java析构方法

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

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

对象的 finalize() 方法具有如下特点:

	垃圾回收器是否会执行该方法以及何时执行该方法,都是不确定的。finalize() 方法有可能使用对象复活,使对象恢复到可触及状态。垃圾回收器在执行 finalize() 方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行。

例如:

protected void finalize() {// 对象的清理工作
}

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

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());    // 输出1Counter cnt2 = new Counter();    // 建立第二个实例System.out.println("数量:"+cnt2.getCount());    // 输出2cnt2 = null;    // 销毁实例2try {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() 方法提示垃圾回收器尽快执行垃圾回收操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2048java课程设计报告_2048小游戏-Java-课程设计报告书

《2048小游戏-Java-课程设计报告书》由会员分享,可在线阅读,更多相关《2048小游戏-Java-课程设计报告书(31页珍藏版)》请在金锄头文库上搜索。1、JAVA 语言程序设计课程设计报告2048 智力小游戏设计专业班级: 计算机科学与技术嵌入 13-1 学生…

python批量音频转格式_python将mp3格式批量转化为wav格式

语音识别无论是接口还是开源的项目,大多情况下都需要将语音格式转化为wav格式。首先,需要安装pydub库,pip install pydub 就行。接下来将你需要转化的mp3文件放入文件夹,创建好需要存入的wav文件夹。接下来python 代码实现 &#…

Java包详解

Java 引入了包(package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。 包允许将类组合成较小的单元(类似文件夹),它基本上隐藏了类,并避免了名称上的冲突…

groovy java_在java中使用groovy怎么搞

临摹微笑一种基于Java虚拟机的动态语言,可以和java无缝集成,正是这个特性,很多时候把二者同时使用,把groovy作为java的有效补充。对于Java程序员来说,学习成本几乎为零。同时支持DSL和其他简介的语法(例如闭包)&#x…

python自动控制库_一个可以自动化控制鼠标键盘的库:PyAUtoGUI

PyAutoGUI 不知道你们有没有用过,它是一款用Python自动化控制键盘、鼠标的库。但凡是你不想手动重复操作的工作都可以用这个库来解决。如果,我想半夜时候定时给发个微信,或者每天自动刷页面等操作,它能完全模拟手动操作&#xff0…

Java使用自定义包

包的声明和使用非常简单,在了解基本语法之后,示例在 Java 程序中声明包,以及不同包之间类的使用。 1 创建一个名为 com.dao 的包。 2 向 com.dao 包中添加一个 Student 类,该类包含一个返回 String 类型数组的 GetAll() 方法。S…

python去掉一个最高分和最低分求平均数_excel去掉一个最高分和最低分求平均数 - 卡饭网...

怎么快速计算考试成绩的最高分、最低分、平均分?怎么快速计算考试成绩的最高分、最低分、平均分? 我们可以使用Excel工作表快速计算出学校考试成绩的最高分.最低分和平均分,不需要逐个计算和核查,下面就跟小编看一下操作方法.具体如下:1. 第一步,打开一个…

mysql 类似wm concat_oracle的wm_concat()和mysql的group_concat()合并同列变成一行的用法以及和concat()合并不同列的区别...

前言标题几乎已经说的很清楚了,在oracle中,concat()函数和 “ || ” 这个的作用是一样的,是将不同列拼接在一起;那么wm_concat()是将同属于一个组的(group by)同一个字段拼接在一起变成一行。mysql是一样的,只不过mysq…

试图将驱动程序添加到存储区_基于容器的块存储使用

什么是块存储?分布式存储系统,为业务与数据在集群内漂移提供了自由保障,满足企业对于不受约束的系统环境要求。同时,平台仅保存迁移被改动的数据,而非整体增加数据量,实现增量备份。魔方云块存储的功能&…

C++类和对象的概念

C 是一门面向对象的编程语言,理解 C,首先要理解类(Class)和对象(Object)这两个概念。 C 中的类(Class)可以看做C语言中结构体(Struct)的升级版。结构体是一种…

参数名称 java_java – 具有重要名称的WSDL中的参数名称

我正在使用JAXWS RI在Java中创建一个WebService.在自动部署应用程序WAR时创建WSDL文件.问题是我希望WSDL文件中的参数(每个操作接收到)具有重要的名称,但它们显示为arg0,arg1,arg2 …有没有办法定义这个参数的名称,不使用默认名称?我已经实施了以下内容:…

python列表生成时 if_Python列表生成式

最简单的列表生成式l [x for x in range(10)]print(l)# 相当于l []for x in range(10):l.append(x)print(l)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]使用运算式的列表生成式l [x * x for x in range(10)]print(l)# 相当于l []for x in range(10):l.a…

如何编译和运行C++程序?

C 和C语言类似,也要经过编译和链接后才能运行。那么C是如何运行的呢,C和C的运行步骤是一样的。我们需要留意的是C源文件的后缀,以及GCC 中的g命令。 下图是 C/C 代码生成可执行文件的过程: C源文件的后缀 C语言源文件的后缀非…

java 控制台五子棋_java控制台五子棋

package frank;import java.io.*;public class App{//棋盘private String[][] board;//棋盘大小private static int BOARD_SIZE 15;//初始化棋盘public void initBoard(){board new String[BOARD_SIZE][BOARD_SIZE];for(int i 0; i < BOARD_SIZE; i){for(int j 0; j<…

pythonista脚本合集_GitHub - xchenhao/You-are-Pythonista: 汇聚【Python应用】【Python实训】【Python技术分享】等等...

You-are-Pythonista汇聚【从零单排】【实战项目】【Python面试题】【大航海】【Python应用】【Python错题集】【技术沙龙】【内推渠道】等等【人人都是Pythonista】由公众号【Python专栏】推出&#xff0c;请认准唯一标识&#xff1a;请仔细阅读本文档&#xff0c;尤其是使用说…

python配色_python语言再次解决文章配色难题

配色的选择是在我们论文文章画图过程中经常面临的一个问题。常用的R或python语言都内置了默认的颜色系统&#xff0c;强大的默认设置可以满足我们的绘图需求。但当我们需要绘制更多的图形时&#xff0c;固定的配色就会显得重复&#xff0c;此时通过自定义颜色就可以丰富图形的表…

java hashcode返回值_Java HashMap返回值未根据我对equals和hashcode的理解进行确认

以下代码示例的输出是&#xff1a;{1–e e2&#xff0c;2–e1 e1}package com.sid.practice;import java.util.HashMap;import java.util.Map;public class InputOutputPractice{public InputOutputPractice(){}public static void main(String[] args){Employee e new Inpu…

C++输入输出

C语言中&#xff0c;我们通常会使用 scanf 和 printf 来对数据进行输入输出操作。在C语言中&#xff0c;C语言的这一套输入输出库我们仍然能使用&#xff0c;但是 C 又增加了一套新的、更容易使用的输入输出库。 简单的输入输出代码示例&#xff1a; #include<iostream>…

python中的pymysql_(转)Python中操作mysql的pymysql模块详解

原文&#xff1a;https://www.cnblogs.com/wt11/p/6141225.htmlhttps://shockerli.net/post/python3-pymysql/----Python 3 进阶 —— 使用 PyMySQL 操作 MySQL前言pymsql是Python中操作MySQL的模块&#xff0c;其使用方法和MySQLdb几乎相同。但目前pymysql支持python3.x而后者…

堆排序java实例_堆排序(示例代码)

前言&#xff1a;网上有很多堆排序的案例&#xff0c;我只想写自己堆排序。一&#xff1a;堆结构即&#xff1a;一个父节点最多只能有两个子节点(可以没有)&#xff0c;如下图图1图2图3 图4二&#xff1a; 数组与堆结构转换假设已知堆数组 int[] a {9,7,6,4,5,1,3,2,} 则相…