A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 张远游 中级黑马   /  2012-11-26 23:27  /  3099 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

final是用来修饰变量,方法,类的,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。
finally是在处理异常时提供finally块执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块。
查了下finalize是一个方法名,是在object类中定义的。今天刚看到这个方法名,大家给说说在什么情况下会用到这个方法?有没有同学使用过啊?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
void finalize():这个方法我们不应该自己去调用!它是由垃圾回收器来调用的!当垃圾回收器回收对象时,在回收之前,会先调用这个对象的finalize()方法。然后就回收这个对象!有一种比较特殊的情况可以使用这个方法:Java可以使用本机方法(也有人叫本地方法,但这个称之不好),本机方法是java可以调用其他语言(C语言)写的内容!其实Java有很多底层的东西都是用C来实现的。其中C语言有开辟内存空间的方法(calloc()),如果有对象使用了这种本机方法,那么可以在这个对象被回收之前来调用 C语言的回收内存方法。这时可以让对象的finalize()方法中写一些用来回收其他语言开辟的内存空间!因为垃圾回收器只能回收java自己开辟的内存空间。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
不是太懂,还没自学到。。。
回复 使用道具 举报
楼主对final 和 finally 总结的很好。
finalize()方法是Object 类中的一个方法,属于垃圾回收中的内容。
需要注意的部分:
finalize()方法是在对象被当成垃圾从内存中释放前调用,而不是在对象变成垃圾前调用,垃圾回收器的启用不由
程序员控制,也无规律可循,并不会一产生了垃圾,它就被唤起,甚至有可能到程序终止,它都没有启动的机会。
因此,finalize()并不是一个很可靠的机制,所以,我们无法保证每个对象的finalize()方法最终都会被调用。

例如:
public class Test12 {
        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                new Person();
                new Person();
                new Person();
                System.out.println("the program is ending");
        }

}

class Person {
        public void finalize() {
                System.out.println("the object is going");
        }
}
编译运行的结果:
the  program is ending

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
这是java中的垃圾回收机制,java中垃圾回收是jvm虚拟机自己调用的,无需像c,c++那样血药程序员自己写回收方法,这样能有效的防止内存溢出的问题,方便了开发。那你首先得知道finalize方法在什么条件下才会触发。类似于C++中的析构函数,虚拟机在回收对象实例时,会调用该对象的finalize方法。System.gc()会回收,并且触发,finalize();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马