`

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面试题解惑系列合集

    1.4 JAVA面试题解惑系列(四)——final、finally和finalize的区别 1.5 JAVA面试题解惑系列(五)——传了值还是传了引用? 1.6 JAVA面试题解惑系列(六)——字符串(String)杂谈 1.7 JAVA面试题解惑系列(七)...

    java面试题 谈谈final, finally, finalize的区别

    一,谈谈final, finally, finalize的区别。 java面试题

    Java面试题解惑系列

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

    final, finally, finalize的区别

    final, finally, finalize的区别

    Java中final,finally,finalize三个关键字的区别_动力节点Java学院整理

    Java中final,finally,finalize三个关键字的区别_动力节点Java学院整理

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

    (四)final、finally 和finalize 的区别 (五)传了值还是传了引用? (六)字符串(String)杂谈 (七)日期和时间的处理 (八)聊聊基本类型(内置类型) (九)继承、多态、重载和重写 (十)话说多线程 (十一)...

    JAVA面试题解惑系列

    类的初始化顺序 ...final、finally和finalize的区别 传了值还是传了引用? 字符串(String)杂谈 日期和时间的处理 聊聊基本类型(内置类型) 继承、多态、重载和重写 话说多线程 这些运算符你是否还记得?

    大公司的Java面试题集

    大公司的Java面试题集 大公司的Java面试题集  第一,谈谈final, finally, finalize的区别。  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一...

    java 基础之final、finally和finalize的区别

    主要介绍了java 基础之final、finally和finalize的区别的相关资料,需要的朋友可以参考下

    典型JAVA面试试题及答案.pdf

    谈谈final, finally, finalize 的区别?final 是一个修饰符, 修饰类的时候表示类不可继承, 所以一个类不可能既是abstract 又是final 的; 修饰变量的时候表示这个变量不可被更改并且必须赋初始值; 修饰方法的时候...

    毕业就业-刷题库Java面试题大全(2021年-2022年).rar

    5. final、finally、finalize 有什么区别? 6. NoClassDefFoundError 和 ClassNotFoundException 区别? 7. try-catch-finally 中哪个部分可以省略? 8. try-catch-finally 中,如果 catch 中 return 了,finally 还...

    java面试题解析困惑之一

    java面试题解析困惑之final、finally和finalize的区别

    Java面试题及答案(面试题集锦)

    谈谈final, finally, finalize的区别。  final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将...

    final、fianlly、finalize区别

    final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为 父类被继承。因此一个类不能既被声明为abstract 的,又被声明为final 的。将变量或 方法声明为 final,可以保证它们在...

    最新最全Java面试题汇总

    最新Java面试题汇总 sleep() 和 wait() 有什么区别、final, finally, finalize的区别、面向对象的特征有哪些方面、ArrayList,Vector, LinkedList的存储性能和特性等诸多面试常见题目

    Java面试大全(备战2021) 最新Java面试必问合集 PDF版

    Java面试大全是一套最新Java面试必问合集,这本面试手册包含了Java基础、Java集合、JVM、Spring、Spring Boot、Spring Cloud、Mysql、Redis、...5. final、finally、finalize 有什么区别? 6. NoClassDefFoundErr

    模拟面试题及答案 Java

    选择了一些经常问到的java面试题,及建议答案,希望对各位面试者有用。...描述final﹑finally和finalize的区别。 编程题:使用JavaScript和HTML编写网页实现如图一所示计算功能: 购买总价=购买价格×购买数量。

    详解Java编程中final,finalize,finally的区别

    主要介绍了详解Java编程中final,finalize,finally的区别,这个在Java面试题中简直是太常见了...需要的朋友可以参考下

    Java面试题及答案-java面试题

    Java 中的 final、finally 和 finalize 关键字有什么区别? final:当用“final”关键字声明一个变量时,它的值一旦被赋值就不能改变。当使用“final”关键字声明方法时,它不能在子类中被覆盖。当用“final”...

Global site tag (gtag.js) - Google Analytics