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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 没有等待的花蕾 中级黑马   /  2015-6-3 21:21  /  2247 人查看  /  45 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

2:finally里面的代码真的永远会执行吗?
                不一定,如执行了finally前执行了System.exit(0);或者断电了
                                但是有一个特殊情况:在代码执行到finally之前,jvm就退出了。

3:加入在catch里面有return语句,请问finally里面的代码还会执行吗?如果执行,是在return前,还是return后?
                会执行。在return前执行。
                准确答案:在return之间执行。
*/
class FinallyTest {
        public static void main(String[] args) {
                // method1();
                // method2();

                int result = method3();
                System.out.println(result);
        }

        private static int method3() {
                int a = 10;
                try {
                        System.out.println(a / 0);
                        System.out.println("a1:" + a);
                } catch (ArithmeticException ae) {
                        System.out.println("a2:" + a); // a2:10
                        a = 20;
                        return a; //这个时候,在内存中就会有一个路径产生,该路径返回值是20.
                                          //但是,它看到了finally代码块,所以,继续执行finally里面的内容               
                                          //当finally里面结束后,会回到以前的执行路径。
                } finally {
                        System.out.println("a3:" + a); // a3:20
                        a = 30;
                        System.exit(0);
                        //return a;
                }
        return a;
        }

        private static void method2() {
                int a = 10;
                int b = 0;
                try {
                        System.out.println(a / b);
                } catch (ArithmeticException ae) {
                        ae.printStackTrace();
                        return;
                } finally {
                        System.out.println("over");
                }
        }

        private static void method1() {
                int a = 10;
                int b = 0;
                try {
                        System.out.println(a / b);
                } catch (ArithmeticException ae) {
                        ae.printStackTrace();
                        System.exit(0);
                } finally {
                        System.out.println("over");
                }
        }
}

评分

参与人数 3技术分 +3 黑马币 +18 收起 理由
飘过的云 + 18
杨小楠 + 1 赞一个!
lwj123 + 2

查看全部评分

45 个回复

正序浏览
长知识啊,学习了.
回复 使用道具 举报
围观一下.......
回复 使用道具 举报
记下了                       
回复 使用道具 举报
赞一个!!!!!
回复 使用道具 举报
好吧!又复习了,,,
回复 使用道具 举报
学以致用呀。。。
回复 使用道具 举报
写的挺详细, 赞一下
回复 使用道具 举报
finalize方法没接触过,看了你的介绍我才知道,有个错误:被final修饰的方法是不能重写,不是重载。
回复 使用道具 举报
不错学习了
回复 使用道具 举报
过来学习学习
回复 使用道具 举报
不错,学到了。。。
回复 使用道具 举报
没有等待的花蕾 发表于 2015-6-5 00:16
重载是在同一类中的,重写是存在继承关系的两个雷里面的

是啊,  被声明为final的方法也同样只能使用,能重载。 不能被重写、
回复 使用道具 举报
受教了。。。。。。。
回复 使用道具 举报
forTomorrow 来自手机 中级黑马 2015-6-5 22:12:53
33#
最后返回值是20还是30
回复 使用道具 举报
3:加入在catch里面有return语句,请问finally里面的代码还会执行吗?如果执行,是在return前,还是return后?
                会执行。在return前执行。
                准确答案:在return之间执行。
*/
class FinallyTest {
        public static void main(String[] args) {
                // method1();
                // method2();

                int result = method3();
                System.out.println(result);
        }

        private static int method3() {
                int a = 10;
                try {
                        System.out.println(a / 0);
                        System.out.println("a1:" + a);
                } catch (ArithmeticException ae) {
                        System.out.println("a2:" + a); // a2:10
                        a = 20;
                        return a; //这个时候,在内存中就会有一个路径产生,该路径返回值是20.
                                          //但是,它看到了finally代码块,所以,继续执行finally里面的内容               
                                          //当finally里面结束后,会回到以前的执行路径。
                } finally {
                        System.out.println("a3:" + a); // a3:20
                        a = 30;
                        //System.exit(0);
                        //return a;
                }
        return a;
        }

这结果返回的是20喔,不是说明了return之后执行finally语句的吗??
回复 使用道具 举报
很有心,我上课都没记全,这面试题,学习了,谢谢
回复 使用道具 举报
挺不错的,赞一个
回复 使用道具 举报
挺不错的 学习下
回复 使用道具 举报
刘健 黑马帝 2015-6-5 16:36:24
28#
基础笔记,多做注释方便自己也方便大家
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马