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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张远游 中级黑马   /  2012-11-26 23:27  /  2852 人查看  /  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 神马都是浮云

查看全部评分

回复 使用道具 举报
是一个回收垃圾的方法!
finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。 finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。finalize就是一个对象的遗书,你把一个对象给杀了总的让他说点什么把。只不过你要注意finalize是垃圾回收启动来清理对象才来调用的,就算自己掉这个方法这个对象也不会就从内存消失的,代码楼上就行。还有就是这个遗书可以把自己复活,另外如果在这个方法抛异常会导致此对象的终结操作停止,这两种都是死而复生的手段。赞同0|评论

示例
public class ObjectGc {   
    public ObjectGc() {}      
  public static void main(String [] args) {     
   ObjectGc og = new ObjectGc();        //很明显,og没有存在的意义了      
     og = null;        //由于垃圾回收是不定时的,我们还是手动回收看看吧     
    System.gc();  
  }   
   //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
     protected void finalize() {      
      System.out.println("我已经被垃圾回收器回收了...");  
  }
}

评分

参与人数 1黑马币 +1 收起 理由
付莹 + 1 神马都是浮云

查看全部评分

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