`

JAVA面试题解惑系列(四)——final、finally和finalize的区别

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
37
10
分享到:
评论
33 楼 wwjjkk 2010-05-14  
补充一点:
try语句块里面调用System.exit(0);的话可以不执行finally语句块里的内容
public final class FinallyTest {   
	  
    public void testReturn() {   
        try {   
            System.exit(0);   
        } catch (Exception e) {   
            e.printStackTrace();   
        } finally {   
            System.out.println("执行了finally语句");   
        }   
    }   
  
    public static void main(String[] args) {   
        FinallyTest ft = new FinallyTest();   
        ft.testReturn();   
    }   
}  
32 楼 wonder 2010-04-18  
关于finally,虽然你的结论对,但是原因还是不对。
对于每个try块可以引起退出的语句,在bytecode层面上都会有一个指定的字节码与finally关联jsr.
因此,finally肯定会被执行。
31 楼 windshjw 2008-09-26  
It is wonderful!
30 楼 臧圩人 2008-07-28  
回复lz726:

呵呵,遇到这样问题写个测试代码比争论更有说服力
29 楼 臧圩人 2008-07-28  
回复javaz、hanfeng1884、ALLEN仔:

谢谢各位支持,请保持关注
28 楼 ALLEN仔 2008-07-28  
不错,顶下!
27 楼 lz726 2008-07-26  
很明显,return、continue和break都没能阻止finally语句块的执行.
看到这里,偶很激动.之前一个项目中,一个项目组成员还跟偶争辩说不是这样,那个时候偶说即便是return了也不能阻止finally的运行.他不相信,跟他吵了半天~.


哈哈,多谢博主,期待更多文章精髓的呈现~
26 楼 hanfeng1884 2008-07-23  
好贴子就该顶起来,让更多的人看到。
25 楼 javaz 2008-07-17  
关注~!
24 楼 臧圩人 2008-07-16  
回复TNTest:
GOOD,很好的问题
23 楼 TNTest 2008-07-16  
  多贴了点儿代码,请从 class FinallyTest 开始看
22 楼 TNTest 2008-07-16  
好文,一直在关注你的这个系列。
提一点:
如果在finally 语句块里有return语句,那么方法return得到的结果是什么呢?

package test;

public class ParentClassTest {
    protected String field1 = "parent field 1";

    protected void method1() {
        System.out.println("ParentClass method 1");
    }

    public static void main(String[] args) {
        ParentClassTest test = new SubClassTest();
        test.method1();
        System.out.println(test.field1);
    }
}

class SubClassTest extends ParentClassTest {
    protected String field1 = "sub field 1";

    public void method1() {
        System.out.println("subclass method 1");
    }
}

class FinallyTest {

    public Object testReturn() {
        try {
            return new ReturnClass();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            System.out.println("执行了finally语句");
            return new AnotherReturnClass();
        }
        //return new ReturnClass2();
    }

    public static void main(String[] args) {
        FinallyTest ft = new FinallyTest();
        // 测试return语句
        Object rtc = ft.testReturn();
        System.out.print(rtc.getClass());
    }
}

class ReturnClass {
    public ReturnClass() {
        System.out.println("执行了return语句");
    }
}

class AnotherReturnClass {
    public AnotherReturnClass() {
        System.out.println("执行了 finally 语句块里的 return语句");
    }
}


输出结果:
执行了return语句
执行了finally语句
执行了 finally 语句块里的 return语句
class test.AnotherReturnClass

也就是说,finally内部的return 结果会覆盖之前执行return的结果。这个行似乎很容易引起歧义:明明我的return语句被执行了,怎么结果不对呢?
不过这个return语句使得编译器给出了一个警告:finally block does not complete normally.
21 楼 zm2693450 2008-07-14  
好贴,顶起来
20 楼 xiaopao 2008-07-12  
受益了。多谢。
19 楼 rexpie 2008-07-11  
一直觉得这个系列的文章很有帮助。继续加油啊。关注。
18 楼 臧圩人 2008-07-10  
回复hrtc:
谢谢支持,请多多关注
17 楼 hrtc 2008-07-10  
继续加油
16 楼 臧圩人 2008-07-10  
回复hrtc minisoft:
谢谢你们提出的质疑,我重新研究后的确发现了文章的错误之处,我已将示例程序完善了,并将结论修订如下:
引用
被final修饰的变量必须被初始化。初始化的方式有以下几种:
  1. 在定义的时候初始化。
  2. final变量可以在初始化块中初始化,不可以在静态初始化块中初始化。
  3. 静态final变量可以在静态初始化块中初始化,不可以在初始化块中初始化。
  4. final变量还可以在类的构造器中初始化,但是静态final变量不可以。
15 楼 xplq 2008-07-10  
太有才了,哈哈!收藏了
14 楼 d13171548 2008-07-10  
写的不错,很容易理解。高人也高人~!

相关推荐

    JAVA面试题解惑系列合集

    .16 1.4 JAVA面试题解惑系列(四)——final、finally和finalize的区别 . . . . . . . . . . . . . . . . . . . . . . . . . . . .22 1.5 JAVA面试题解惑系列(五)——传了值还是传了引用? . . . . . . . . . . ....

    臧圩人--JAVA面试题解惑系列合集.pdf

    **1.4 JAVA面试题解惑系列(四)——final、finally和finalize的区别** - **知识点**:阐述final关键字的用途(不可变性)、finally块的作用(确保资源释放)、以及`finalize()`方法的功能(垃圾回收前的清理工作)...

    Java面试题解惑系列

    4、final,finally,finalize;5.传了值还是传了引用;6.String杂谈;7.日期与时间的处理;8.基本类型总结;9.继承,多态,重载,重写;10.多线程;11.运算符总结。 适合将要笔试面试Java的朋友参考。

    Java面试题详解,和一些基础知识的深入剖析,个人认为非常棒

    接下来是“JAVA面试题解惑系列(四)——final、finally和finalize的区别”。final用于声明不可改变的变量、类或方法;finally是异常处理的一部分,保证无论是否发生异常,都会执行的代码块;而finalize是对象被垃圾...

    JAVA面试题解惑系列

    【JAVA面试题解惑系列】是一系列专门针对Java开发者面试准备的文章集合,涵盖了多个核心Java概念和面试常问问题。作者臧圩人在JavaEye社区分享了这个系列,旨在帮助求职者理解和解答面试中可能出现的疑问。 1. **类...

    JAVA面试题解惑系列114页.pdf

    - **final、finally和finalize的区别**:final用于声明不可变的变量或不能被继承的类;finally确保代码块中的语句总会被执行,无论是否有异常发生;而finalize是对象被垃圾收集器回收前调用的方法,通常用于资源清理...

    java面试题

    给定文件的内容主要涉及Java开发中常见的面试题解惑系列,其中涵盖了类的初始化顺序、String对象的创建、变量覆盖、final关键字的用法、引用传递以及字符串处理等重要的Java知识点。 首先,关于类的初始化顺序,...

Global site tag (gtag.js) - Google Analytics