1、基本数据类型
public class BasicDataType {
public static void main(String[] args) {
System.out.println(basicDataType());
}
public static int basicDataType() {
int i = 0;
try {
i = 1;
return i;
} finally {
i = 2;
}
}
}
jvm编译后代码:
public class BasicDataType {
public BasicDataType() {
}
public static void main(String[] args) {
System.out.println(basicDataType());
}
public static int basicDataType() {
boolean var0 = false;
byte var1;
try {
int i = 1;
var1 = i;
} finally {
var0 = true;
}
return var1;
}
}
运行结果为:
2、String类型
public class StringType {
public static void main(String[] args) {
System.out.println(testStringType());
}
public static String testStringType() {
String t = "init";
try {
t = "try";
return t;
} finally {
t = "finally";
}
}
}
jvm编译后代码:
public class StringType {
public StringType() {
}
public static void main(String[] args) {
System.out.println(testStringType());
}
public static String testStringType() {
String t = "init";
String var1;
try {
t = "try";
var1 = t;
} finally {
t = "finally";
}
return var1;
}
}
运行结果为:
3、引用类型
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private Integer age;
}
public class ReferDataType {
public static void main(String[] args) {
System.out.println("test1:" + test1 ());
System.out.println("test2:" + test2 ());
System.out.println("test3:" + test3 ());
}
public static List<Person> test1 () {
List<Person> list = new ArrayList<>();
try {
Person p1 = new Person("张三",20);
Person p2 = new Person("李四",30);
Person p3 = new Person("王五",0);
list.add(p1);
list.add(p2);
list.add(p3);
return list;
} finally {
list = list.stream().filter(item -> item.getAge() > 0).collect(Collectors.toList());
System.out.println("test1 ()方法内:" + list);
}
}
public static List<Person> test2 () {
List<Person> list = new ArrayList<>();
try {
Person p1 = new Person("张三",20);
Person p2 = new Person("李四",30);
list.add(p1);
list.add(p2);
return list;
} finally {
Person p3 = new Person("王五",0);
list.add(p3);
}
}
public static Person test3 () {
Person p = new Person();
try {
p.setName("张三");
p.setAge(20);
return p;
} finally {
p.setAge(40);
}
}
}
jvm编译后代码:
public class ReferDataType {
public ReferDataType() {
}
public static void main(String[] args) {
System.out.println("test1:" + test1());
System.out.println("test2:" + test2());
System.out.println("test3:" + test3());
}
public static List<Person> test1() {
ArrayList list = new ArrayList();
ArrayList var4;
try {
Person p1 = new Person("张三", 20);
Person p2 = new Person("李四", 30);
Person p3 = new Person("王五", 0);
list.add(p1);
list.add(p2);
list.add(p3);
var4 = list;
} finally {
List<Person> list = (List)list.stream().filter((item) -> {
return item.getAge() > 0;
}).collect(Collectors.toList());
System.out.println("test1 ()方法内:" + list);
}
return var4;
}
public static List<Person> test2() {
ArrayList list = new ArrayList();
boolean var8 = false;
ArrayList var3;
try {
var8 = true;
Person p1 = new Person("张三", 20);
Person p2 = new Person("李四", 30);
list.add(p1);
list.add(p2);
var3 = list;
var8 = false;
} finally {
if (var8) {
Person p3 = new Person("王五", 0);
list.add(p3);
}
}
Person p3 = new Person("王五", 0);
list.add(p3);
return var3;
}
public static Person test3() {
Person p = new Person();
Person var1;
try {
p.setName("张三");
p.setAge(20);
var1 = p;
} finally {
p.setAge(40);
}
return var1;
}
}
运行结果为:
总结:
如果是返回基本类型的值,那么在缓存时也是缓存值本身,所以后面在finally块中重新赋值时,方法返回的值不会受finally块中重新赋值的影响;
如果返回的是引用类型的值,那么在缓存时,缓存的是引用类型对象的引用,所以虽然后面在finally块中重新赋值时(重新指向另一个对象),方法返回的值不会受到影响,但是如果是修改对象的属性,那么会影响到返回的值。