文档章节

java中的final,finally和finalize

Loveror_ahu
 Loveror_ahu
发布于 2017/09/08 16:16
字数 1053
阅读 8
收藏 0
点赞 0
评论 0

 

        大体上讲,这三个词没啥联系,final是修饰字符,可定义变量,方法,类;finally是作为捕获异常后将要执行的操作放到它包含的区域;finalize则是与java的垃圾回收有关的方法。那么接下来我们就一一了解一下这三部分内容。

1.finalize()

        跟大多数人一样,看到这个方法你很容易想到在java的垃圾回收中应用。在java编程思想中有这样的描述,java的垃圾回收器负责回收无用对象占据的内存资源,但也存在特殊情况:假定你的对象并非是使用java的关键词new获得的一块特殊的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块特殊的内存。为了应对这样的情况,java允许在类中定义一个名为finalize()的方法。你可能会疑问,java中一切都是对象,对象占用的存储空间还有不通过new的吗?其实有,我们试想如果在java中调用非java语言如C语言的malloc()方法呢,如果这样不执行free()方法,对于这样的一块空间,垃圾回收器是不是就无法回收呢?

        finalize()的工作原理可以理解为这样:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

        然而java中的finalize()是区别C++中的析构函数的,因为在C++的析构函数一定会摧毁对象,释放内存的,而java中的对象却并不一定会被垃圾回收 。所以对于java的垃圾回收,我们要牢记三点:

        a.java对象可能不被垃圾回收

        b.垃圾回收类似析构但不等于析构

        c.垃圾回收只做与内存有关的事情

        简单点记忆就是,在finalize方法中做你想在java垃圾回收器执行垃圾回收时必须要做的清理工作。在JVM中,垃圾回收器采用"标记-回收"的原则,对需要清理的对象进行清理,详细的常用方法就不在这里谈了。

2.final关键字

        java中final修饰的三种情况有数据,方法,类。

        当某个类整体定义为final时,就表明了该类无法被继承,由于final类是禁止继承,所以final类中所有的方法都隐式指定为final的,这样无法覆盖该方法。

        当某个方法被定义为final时,就表明了你想把方法锁定,防止任何继承类修改,这样做的另一个目的就是效率,final方法就是同意编译器将针对该方法的所有调用都转为内嵌调用。

        当某个数据(常量,参数变量)被定义为final时,该数据(数值或者对象的引用)在运行中不可改变。不过final修饰的数据必须在定义时给定初始值。

3.finally

        对于没有垃圾回收和析构函数自动调用机制的编程语言来说,finally就很重要了,把回收工作全部放到finally域中,内存总能释放。但对于java有垃圾回收机制而言,finally就是用在除内存之外的资源恢复工作上。

 

© 著作权归作者所有

共有 人打赏支持
Loveror_ahu
粉丝 1
博文 10
码字总数 10354
作品 0
南京
程序员
java程序员基础进阶篇,万丈高楼平地起

一.final,finally,finalize 三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这...

启示录是真的 ⋅ 05/26 ⋅ 0

Java编程语言:精选,Java程序员的笔试题,你都知道答案吗?欢迎来补充!!!

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

启示录是真的 ⋅ 05/23 ⋅ 0

【Java】疯狂Java基础(二)——final, finally, finalize 的区别

一、前言 这次说说final、finally、finalize这三者的区别,其实对这三者有了解的程序员,基本都知道,他们三个之间没有毛线关系。就是因为名字相似,其他的什么也没有。 二、final final可以...

kisscatforever ⋅ 03/29 ⋅ 0

java编程学习常见面试题及答案

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/22 ⋅ 0

【JavaSE(十二)】JavaIO流(上)

原文地址:https://www.cloudcrossing.xyz/post/44/ 1 异常 1.1 异常概述 异常就是Java程序在运行过程中出现的错误。 程序的异常:Throwable类是 Java 语言中所有错误或异常的超类,其子类有...

苍云横渡 ⋅ 05/26 ⋅ 0

java编程新手入门学习的基础语法

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/28 ⋅ 0

Java编程新手基础知识学习性能优化,这些技巧你知道吗?

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/16 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

Thread源码分析-java8

1.Thread特性分析 守护线程Daemon 2种方式创建一个可执行线程 线程名字 线程ID 线程优先级 线程状态6种 浅拷贝 2. 类、方法、字段分析 实现接口和继承类 只实现了一个接口Runnable threadLo...

caoxiaohong1005 ⋅ 05/14 ⋅ 0

JAVA程序员面试题整理(较全面)

以下是在面试中可能会遇到的问题,话不多说,往下看 1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? ...

编程大侠 ⋅ 04/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 28分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 29分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 33分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 45分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 51分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

nmap为了开发方便 可以做简单的修改

因为nmap扫描是默认使用的是nse脚本,但是在开发的过程中需要修改后缀(主要是因为后缀为lua才能显示高亮,所以这里用一个取巧的办法) nse_main.lua文件中我们找到如下代码 local t, path = cn...

超级大黑猫 ⋅ 今天 ⋅ 0

springmvc获取axios数据为null情况

场景:前端用了vue没有用ajax与后台通信,用了axios,但是在代码运行过程中发现axios传递到后台的值接受到数据为null。 问题原因:此处的问题在与axios返回给后台的数据为json类型的,后台接...

王子城 ⋅ 今天 ⋅ 0

hadoop技术入门学习之发行版选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个...

左手的倒影 ⋅ 今天 ⋅ 0

806. Number of Lines To Write String - LeetCode

Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行。 Java实现: public int[] numberOfLines(int[] widths, Str...

yysue ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部