黑马程序员技术交流社区

标题: java中final、finalize、finally之间到底有什么关系? [打印本页]

作者: 张宝    时间: 2013-3-16 20:58
标题: java中final、finalize、finally之间到底有什么关系?
本帖最后由 张宝 于 2013-3-16 23:16 编辑

java中final、finalize、finally长的这么像,它们之间有什么关系吗?
作者: 沈子豪    时间: 2013-3-16 21:01
inal—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
作者: 边道坚    时间: 2013-3-16 21:20
本帖最后由 边道坚 于 2013-3-16 21:28 编辑

嘿嘿 这三个确实长的挺像的、、
作者: 戴乾刚    时间: 2013-3-16 22:10
final关键字
可以用于以下四个地方:
1. 定义变量,包括静态的和非静态的。
2. 定义方法的参数。
3. 定义方法。
4. 定义类。
第一种情况,如果final修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,即它是个常量;
如果final修饰的是一个对象,就表示这个变量被赋予的引用是不可变的,这里需要注意的是,不可改
变的只是这个变量所保存的引用,并不是这个引用所指向的对象。在第二种情况下,final的
含义与第一种情况相同。实际上对于前两种情况,有一种更贴切的表述final的含义的描述,
那就是,如果一个变量或方法参数被final修饰,就表示它只能被赋值一次,但是JAVA虚拟
机为变量设定的默认值不记作一次赋值。
被final修饰的变量必须被初始化。初始化的方式有以下几种:
1. 在定义的时候初始化。
2. final变量可以在初始化块中初始化,不可以在静态初始化块中初始化。
3. 静态final变量可以在静态初始化块中初始化,不可以在初始化块中初始化。
4. final变量还可以在类的构造器中初始化,但是静态final变量不可以


finally的用法。
这个就比较简单了,它只能用在try/catch语句中,
并且附带着一个语句块,表示这段语句最终总是被执行。

finalize:
它是一个方法,属于java.lang.Object类,它的定义如下:
protected void finalize() throws Throwable { }
finalize()方法是GC(garbage collector)运行机制的一部分。
finalize()方法是在GC清理它所从属的对象时被调用的,如果执行它的过程中抛出了无法捕
获的异常(uncaught exception),GC将终止对改对象的清理,并且该异常会被忽略;直到
下一次GC开始清理这个对象时,它的finalize()会被再次调用。
作者: 黑马17期-闫东东    时间: 2013-3-16 22:47
final、finalize、finally三者没有什么关系:
final 修饰符
    修饰类:不能被继承  String类是一个典型的final类。
    修饰方法:方法不能被重写
    修饰属性:属性是常量  final修饰的属性这个属性的名字要全都大写。
fianlly:异常中的语句,用于关闭资源,因为无论是否产生异常,finally最后都会被执行。

finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
作者: 黄玉昆    时间: 2013-3-16 22:56
http://bbs.itheima.com/forum.php ... ;highlight=finalize
这个问题已经有人问过了
作者: 石伟    时间: 2013-3-16 22:56
final 是定义时的一个关键字,被final定义的类不能被继承,定义的属性也不可以重新赋值;

finally是
try{}
catch()
{}
finally{}
中使用,不管前面是否执行,finally里面的内容都一定会执行;

finalize是java的垃圾回收机制。。。
作者: 黄玉昆    时间: 2013-3-16 22:58
边道坚 发表于 2013-3-16 21:20
嘿嘿 这三个确实长的挺像的、、

我记得这是你之前问过的问题,如果明白了,请给提问者回答一下,是对自己的巩固,也是对提问者的帮助,谢谢
作者: Alex shaw    时间: 2013-3-16 22:59
首先要明白这三个关键字用到的地方,final用于某个方法或者变量或者类上,表示类不能被继承,方法不能被重写,变量是一个常量
而finally通常是和trycatch连用,表示无论之前的代码是否出异常,都要执行finally中的语句,而finalize是用于垃圾回收的,通常我们不需要主动调用
他们三个是完全不同的三个东西
作者: Alex shaw    时间: 2013-3-16 22:59
首先要明白这三个关键字用到的地方,final用于某个方法或者变量或者类上,表示类不能被继承,方法不能被重写,变量是一个常量
而finally通常是和trycatch连用,表示无论之前的代码是否出异常,都要执行finally中的语句,而finalize是用于垃圾回收的,通常我们不需要主动调用
他们三个是完全不同的三个东西
作者: 何仕映    时间: 2013-3-16 23:02
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。

  finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

  finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。


这些问题在我发的共享里面有哈。http://bbs.itheima.com/thread-41393-1-1.html
作者: 黄诗宾    时间: 2013-3-16 23:06
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
作者: 边道坚    时间: 2013-3-16 23:09
黄玉昆 发表于 2013-3-16 22:58
我记得这是你之前问过的问题,如果明白了,请给提问者回答一下,是对自己的巩固,也是对提问者的帮助,谢 ...

嗯 我已经明白这三者的联系了,也改成已解决了
作者: 黄玉昆    时间: 2013-3-16 23:12
边道坚 发表于 2013-3-16 23:09
嗯 我已经明白这三者的联系了,也改成已解决了

额,我的意思是给这位同学解答一下。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2