首先要知道finally是一定要执行的
private static int extracted() {
int i = 10;
try {
return i++; // 先return 再++ 此时i=11
}catch (Exception e){
e.printStackTrace();
}finally {
i++; //此时i=12
System.out.println("i的值是"+i); //所以打印为12
}
return i; //此行为了运行,因为try里面的语句,Java不一定执行,认为不一定有返回值,所以要给
//一个返回值
}
执行上述代码,调用后的返回值为10 而控制台打印为12
再来看一个引用数据类型,Person类有set方法设置成员变量
private static Person m(){
Person person = new Person();//因为new一个对象,所以存储在堆空间中
try {
person.setName("zjl");
person.setAddress("tw");
return person; //返回的是对象的地址
}finally {
person.setName("jjj"); //而此时修改的正是对象的地址,finally最后一定执行
person.setAddress("qqq");//所以此时返回的数值为jjj、qqq
}
}
上面答案为jjj、qqq
我们再来一个字符串
private static String mo(){
String str ;
try {
str = "abc";
return str;//返回的是上面str的地址,也就是abc常量的地址
}finally {
str = "def";//而str现在的地址已经被更改了
}
}
此时返回的值为abc,因为字符串是常量不可更改,可知String不可修改,而String更改后更改的是地址值,所以返回的是abc