文档章节

java中的final,finally和finalize

Loveror_ahu
 Loveror_ahu
发布于 2017/09/08 16:16
字数 1053
阅读 8
收藏 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
博文 11
码字总数 11020
作品 0
南京
程序员
JAVA final finally finalize区别

简单区别: 中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联: final:java中的关键字,修饰符。 1.如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被...

qq22734179
2014/03/21
0
0
Java finalize方法

《JAVA编程思想》: java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4)....

清风伴月
2017/10/22
0
0
Java深究之final、finally、finalize三者的区别

在java中final、finally、finalize三者在写法上很相近,但是实际含义和作用却是相差甚远。本文主要是来深层的研究下这三者的用法以及之间的区别 1.final 属性:java中的关键字,修饰符 作用:...

MaxBill
06/29
0
0
java程序员基础进阶篇,万丈高楼平地起

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

启示录是真的
05/26
0
0
Java编程语言:精选,Java程序员的笔试题,你都知道答案吗?欢迎来补充!!!

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

启示录是真的
05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
11分钟前
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
13分钟前
0
0
Nginix开启SSL支持HTTPS访问(自签名方法)

Nginix开启SSL支持HTTPS访问(自签名方法) 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器...

openthings
29分钟前
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0
jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部