答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
这种问题,只要想明白修改的是什么就ok了 修改的是内存地址,还是地址里面的内容X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer(); 这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
我是这样理解的,首先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");改变它的指向,已经和返回值无关了。
StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
//输出1,传递的是一个对象的“复本”修改的是对象指向的内容
System.out.println(x1);
//输出3,finally怎样都会执行,因为其修改了地址里面的内容
System.out.println(x2);
但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
修改的是内存地址,还是地址里面的内容X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
修改的是内存地址,还是地址里面的内容X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
x,x1同一块内存区域,
之后x重新指向另一块区域,x1又没有变啊
修改的是内存地址,还是地址里面的内容X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer();
这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。ok,明白。谢啦··哈哈
调用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");只要弄清楚了,哪些是对引用的修改,哪些是对内存空间的修改就很容易弄明白了!
第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递
第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
怎么会有这种想法呢?java中就只有传值而已(地址同样是个值)
兄台所说的传地址是指的是传引用吗?
不要在java语言中讨论传引用的问题!
java中根本就没有传引用这个概念!
"传引用"就我现在知道的来说就只要C++吧
1 运行expression求值,将其结果放到寄存器中
2 跳到finally处,执行finally里面的代码
3 返回步骤1中存入寄存器的结果因此,无论步骤2中的finally对步骤1中expression的结果有多大的影响,都已经无济于事了
1 让他自己发生变化,或者
2 让掌控他的人自己替换
3 第三者不要插足
第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
怎么会有这种想法呢?java中就只有传值而已(地址同样是个值)
兄台所说的传地址是指的是传引用吗?
不要在java语言中讨论传引用的问题!
java中根本就没有传引用这个概念!
"传引用"就我现在知道的来说就只要C++吧嗯,那能不能这样理解呢,在java中,基本数据类型的参数,属于传值,而对于引用数据类型传的是在堆里么开辟的空间地址。麻烦赐教一下··
传如的x 时,也是传的x的地址的引用,x.append(“a”);其s地址中的值会增加a, x = new StringBuffer(); 这时x的指向变了为新的一个地址,而finally块中把这个地址值放了3,然后又重新换了指向,而返回值的指针地址,已经被放到一边了,这时再 x = new StringBuffer("4");改变它的指向,已经和返回值无关了。
试了一下第一个输出语句,结果是1。。有些疑惑
return前会调用finaaly,先把1赋值给x,再把3赋值给x,覆盖掉原来的1
然后将x = 3返回。这是我原本的了解,但结果却不是这样的
好心人能否整个内存图或者大白话的给解析解析么
哥们好纠结
try 里的return 是先于finally执行的,执行到return时x==1 ,return x; 相当于return 1;
然后去执行finally 里的x = 3;这个时候和return 已经没有什么关系了。第2题,传进来的是一个对象的引用,你可以这么想,
JVM操作的是入参的一个副本,而不是入参那个变量本身,x 就相当于x1的副本,它俩指向同一个对像,所以通过x 可以修改对象里面的值,但是改变x 的指向对x1 是没有影响的。
第二个和第三个都是只要你理解了java参数传递就明白了,分清楚值传递和地址传递String是传值还是传址呢?基本数据类型的参数,是传值还是传址呢?
怎么会有这种想法呢?java中就只有传值而已(地址同样是个值)
兄台所说的传地址是指的是传引用吗?
不要在java语言中讨论传引用的问题!
java中根本就没有传引用这个概念!
"传引用"就我现在知道的来说就只要C++吧不好意思,误人子弟了,的确java中的确是没有地址传递的,全是值传递。只是参数传递分为基本数据类型传递和引用数据类型传递。基本数据类型很明显就是基本数据类型(int、char等)及其封装类(Integer、Character等),以及其他一些final修饰的类,如String因为他们的值是不会变的。引用数据类型,就是所有自定义的类,作为参数,传递的是它的地址,地址是不会改变的,但是可以改变改地址指向实例里的值。不知道这样说能不能够说清楚
try{
x=1;
return x;
}catch(){
x=2;
return x;
}finally{
x=3;
// return x;
}
若finally块里面有return,则会覆盖try块里面的return。若没有,当然是按try块的return返回值。
finally块应该是释放资源之类的作用。