我在玩耍以学习为目的,但我有一个问题。请参见下面的代码:
public static void main(String[] args) {
System.out.print(getNumber());
}
public static double getNumber() {
double number =10;
try {
String [] students = {"nick","george"};
System.out.println(students[5]);
}
catch (ArrayIndexOutOfBoundsException ex ) {
System.out.println("In catch block "+ number);
return number;
}
finally {
number +=10;
System.out.println("The value is now "+ number);
}
System.out.println("hiiiii");
return number;
}
为什么在这种情况下,main方法的输出将为10,为什么如果我运行相同的示例并返回一个对象,该值将被更改?
public static void main(String[] args) {
System.out.println("In main is "+getStringBuffer());
}
public static StringBuffer getStringBuffer() {
StringBuffer number = new StringBuffer("10");
try {
String [] names= {"george" ,"nick"};
System.out.println(names[5]);
}
catch (ArrayIndexOutOfBoundsException ex1) {
System.out.println("In catch block "+ number);
return number;
}
finally {
number.reverse();
System.out.println("In finally is "+ number);
}
System.out.println("hiiii");
return number;
}
方法返回的值return
从遇到的语句开始设置。所以
return number;
并不表示“记住要返回number
变量”,而是表示“评估number
变量,并记住将其用作返回值的结果值”。number
稍后(在finally
块中)更改变量的内容对方法返回的值(已确定)没有影响。
我们怎么知道呢?因为return
必须评估表达式(根据JLS的第14.17节)。例如,假设您有
return number + 5;
...您不会期望得到的,25
因为您有10
,命中该return
语句,然后10
在finally
块中添加了另一个,然后表达式又添加了5
更多,对吗?return
计算表达式并记住该值作为方法的返回值。
在您提供的对象示例中,返回的值在finally
块中未更改。它仍然只是对对象的引用。您正在更改要返回其引用的对象的状态,但是该引用没有更改。如果您更换
number.reverse();
与
number = new StringBuffer();
...您会看到与a完全相同的行为double
,因为在这种情况下,就像在使用时一样,您正在更改保存在(对对象的引用)中的值。number
number += 10;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句