【发布时间】:2014-03-31 20:23:47
【问题描述】:
我正在阅读此question 并得到以下代码 sn-p:
public void testFinally(){
System.out.println(setOne().toString());
}
protected StringBuilder setOne(){
StringBuilder builder=new StringBuilder();
try{
builder.append("Cool");
return builder.append("Return");
}finally{
builder.append("+1");
}
}
答案是: CoolReturn+1
好的,然后我用String 和int 尝试了同样的方法,下面是我的代码sn-p 和String:
public void testFinally(){
System.out.println(setOne().toString());
}
protected String setOne(){
String str = "fail";
try{
str = "success";
return str;
}finally{
str = str + "fail";
}
}
为什么答案是: success。为什么不successfail,因为在第一种情况下最终附加值,我在这里进行连接?
我也尝试了原始类型int
public void testFinally(){
System.out.println(setOne());
}
protected int setOne(){
int value = 10;
try{
value = 20;
return value ;
}finally{
value = value + 10;
}
}
这也是为什么答案是: 20 为什么不是 30。
【问题讨论】:
-
stackoverflow.com/questions/16030858/…你可以参考这篇文章了解更多详情..
-
我已经阅读了答案,他们说
StringBuilder对象指向相同的引用,所以我们可以更改如果我引用null怎么办我仍然得到ReturnCool作为答案为什么不是null -
@Vishrant 如果引用
null,则将引用变量的值更改为null。如果只是修改StringBuilder本身,则根本不会更改引用变量的值。它仍然指向同一个对象。将变量视为一个整数,其中包含一个对象的内存地址。 -
@Vishrant 这正是同一个问题(和答案),即使示例不同。
int是int,引用变量是内存地址。规则是一样的。考虑一个引用变量,就像您返回一个int一样,它是一个数据数组的索引。您可以从finally块更改该数组中的数据,但不能更改返回的 index。稍后,如果您访问该索引处的数组,您将看到finally块对数据所做的更改,但返回的值没有更改。原语和参考值是一样的。 -
请注意,不变性与这里的一般概念无关。如果返回值是等于 42 的
int、等于 98.6 的double或等于0x12345678的内存地址,则没有区别。返回的值不能被finally块修改,尽管finally块当然可以修改它希望的任何其他数据,包括返回的内存地址恰好指向的数据。这个问题和这个一样,答案也是一样的。
标签: java