zoukankan      html  css  js  c++  java
  • 检验对finally理解是否透彻的一段代码

    刚在在csdn看到一篇关于讨论finally试题的帖子:http://bbs.csdn.net/topics/390439078

    程序代码:

    package test;
    
    public class Test {
        
        public int inc() {
            int x;
            try {
                x = 1;
                return x;
            } catch (Exception e) {
                x = 2;
                return x;
            } finally {
                x = 3;
            }
        }
        
        public StringBuffer inc(StringBuffer x) {
            try {
                x.append("1");
                x = new StringBuffer();
                return x;
            } catch (Exception e) {
                x.append("2");
                return x;
            } finally {
                x.append("3");
                x = new StringBuffer("4");
            }
        }
        
        public static void main(String[] args) {
            int x = new Test().inc();
            System.out.println(x);
            StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
            System.out.println(x1);
            System.out.println(x2);
        }
    }

    刚开始看到的时候感觉很简单,后来把程序运行之后发现结果和自己想的的不一样,就仔细分析了一下!

    运行结果:

    1
    1
    3

    分析结果:

    1、int x = new Test().inc();
    调用inc()方法,定义int x,在try对x赋值为1,然后return x!虽然finally中对x重新赋值,但是此时对inc()返回值没有影响!所以返回1
    其中需要注意的两点时:x值已经改变,只是先return了,再改变x的值而已,所以只是对方法的返回值没有影响而已!
    假如在finally中也有return,那么此时返回的值为3.

    2、StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
    调用inc(x1)方法,在try中相当于x1.append("1"); 
    此时x1 = new StringBuffer(); 相当于x1 指向新的内存地址可以看做为:x1 = xx2 = new StringBuffer()
    然后 return xx2;
    在finally中xx2.append("3");xx2 = xxx3 = new StringBuffer("4");

    所以new Test().inc(x1)返回的引用地址是xx2,指向的内存空间是xx2.append("3")
    x1的地址没变,指向的内存空间是x1.append("1");

    只要弄清楚了,哪些是对引用的修改,哪些是对内存空间的修改就很容易弄明白了!

    最终结果为:1,1,3
    
    
  • 相关阅读:
    php备份数据库类分享
    nginx https配置后无法访问,可能防火墙在捣鬼
    linux服务器,svn认证失败,配置问题,防火墙等等
    为了解决linux配置Nginx 只能关闭防火墙才能访问的问题
    nginx 防火墙、权限问题
    思数云hadoop目录
    delete
    善用GIMP(Linux下的Photoshop),图像处理轻松又自由
    超赞干货!2016年新鲜出炉的20款网页开发工具推荐
    10款Web前端工具
  • 原文地址:https://www.cnblogs.com/quyongjin/p/3049390.html
Copyright © 2011-2022 走看看