本帖最后由 qq548573025 于 2013-04-25 17:36:25 编辑

解决方案 »

  1.   

            System.out.println(x);//输出1,因为方法返回的是1,虽然finally会被执行
            StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
           
             //输出1,传递的是一个对象的“复本”修改的是对象指向的内容
              System.out.println(x1);
             //输出3,finally怎样都会执行,因为其修改了地址里面的内容       
            System.out.println(x2);
      

  2.   

    答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.
    但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
      

  3.   

    这种问题,只要想明白修改的是什么就ok了
    修改的是内存地址,还是地址里面的内容X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
    这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
      

  4.   

    这种问题,只要想明白修改的是什么就ok了
    修改的是内存地址,还是地址里面的内容X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
    这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
    x,x1同一块内存区域,
    之后x重新指向另一块区域,x1又没有变啊
      

  5.   

    这种问题,只要想明白修改的是什么就ok了
    修改的是内存地址,还是地址里面的内容X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
    这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。ok,明白。谢啦··哈哈
      

  6.   

    一句话 finally 总是会在return之前执行
      

  7.   

    是finally在try模块中return之后运行!先把try或catch所以的代码运行完才会运行finally中代码
      

  8.   

    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");只要弄清楚了,哪些是对引用的修改,哪些是对内存空间的修改就很容易弄明白了!
      

  9.   


    第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递
      

  10.   


    第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
      

  11.   


    第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
       怎么会有这种想法呢?java中就只有传值而已(地址同样是个值)
     兄台所说的传地址是指的是传引用吗?
    不要在java语言中讨论传引用的问题!
    java中根本就没有传引用这个概念!
    "传引用"就我现在知道的来说就只要C++吧
      

  12.   

    java中只有值调用,但是要分清楚对象的引用变量和对象本身~~~
      

  13.   

    唯一的难点在于,return 和finally的关系执行到 return expression的时候,
    1 运行expression求值,将其结果放到寄存器中
    2 跳到finally处,执行finally里面的代码
    3 返回步骤1中存入寄存器的结果因此,无论步骤2中的finally对步骤1中expression的结果有多大的影响,都已经无济于事了
      

  14.   

    至于什么传值传引用,记住一点,Java的编程思维不是这个样子的,不要把你想要改变的对象传给谁,而是
    1 让他自己发生变化,或者
    2 让掌控他的人自己替换
    3 第三者不要插足
      

  15.   


    第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
       怎么会有这种想法呢?java中就只有传值而已(地址同样是个值)
     兄台所说的传地址是指的是传引用吗?
    不要在java语言中讨论传引用的问题!
    java中根本就没有传引用这个概念!
    "传引用"就我现在知道的来说就只要C++吧嗯,那能不能这样理解呢,在java中,基本数据类型的参数,属于传值,而对于引用数据类型传的是在堆里么开辟的空间地址。麻烦赐教一下··
      

  16.   

    我是这样理解的,首先finaaly 不管怎么样都会执行,而是在catch 块后,return 前执行,方法返回的不是值,而是地址的引用,同意楼上解释方法inc() ,而方法2也是这样,在因为在进入finally语句块之前,会有一个暂时保存的过程,执行完finally后再返回地址的引用,如StingBuffer x = new StringBuffer;
    传如的x 时,也是传的x的地址的引用,x.append(“a”);其s地址中的值会增加a,     x = new StringBuffer();  这时x的指向变了为新的一个地址,而finally块中把这个地址值放了3,然后又重新换了指向,而返回值的指针地址,已经被放到一边了,这时再  x = new StringBuffer("4");改变它的指向,已经和返回值无关了。
      

  17.   

    新手先一下
    试了一下第一个输出语句,结果是1。。有些疑惑
    return前会调用finaaly,先把1赋值给x,再把3赋值给x,覆盖掉原来的1
    然后将x = 3返回。这是我原本的了解,但结果却不是这样的
    好心人能否整个内存图或者大白话的给解析解析么
    哥们好纠结
      

  18.   

    首先java是传值的。
    try 里的return 是先于finally执行的,执行到return时x==1 ,return x; 相当于return 1;
    然后去执行finally 里的x = 3;这个时候和return 已经没有什么关系了。第2题,传进来的是一个对象的引用,你可以这么想,
    JVM操作的是入参的一个副本,而不是入参那个变量本身,x 就相当于x1的副本,它俩指向同一个对像,所以通过x 可以修改对象里面的值,但是改变x 的指向对x1 是没有影响的。
      

  19.   


    第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
       怎么会有这种想法呢?java中就只有传值而已(地址同样是个值)
     兄台所说的传地址是指的是传引用吗?
    不要在java语言中讨论传引用的问题!
    java中根本就没有传引用这个概念!
    "传引用"就我现在知道的来说就只要C++吧不好意思,误人子弟了,的确java中的确是没有地址传递的,全是值传递。只是参数传递分为基本数据类型传递和引用数据类型传递。基本数据类型很明显就是基本数据类型(int、char等)及其封装类(Integer、Character等),以及其他一些final修饰的类,如String因为他们的值是不会变的。引用数据类型,就是所有自定义的类,作为参数,传递的是它的地址,地址是不会改变的,但是可以改变改地址指向实例里的值。不知道这样说能不能够说清楚
      

  20.   

    楼主这个StringBuffer出题出的不错,虽然方法是在finally之前返回“”了,但是末了又追加了一个3.
      

  21.   


    try{
       x=1;
       return x;
    }catch(){
       x=2;
       return x;
    }finally{
       x=3;
    // return x;
    }
    若finally块里面有return,则会覆盖try块里面的return。若没有,当然是按try块的return返回值。
    finally块应该是释放资源之类的作用。
      

  22.   

    finally是在try中return后执行的。