今天将一个变量A传到一个方法B(A)中,然后再到B外部调用A,发现A的值不对,后来发现这是一个闭包的概念
写了一个小程序测试了一下
private static void numberTest(Person j) {
System.out.println("numberTest1:" + j.age);
// j = 3;
System.out.println(j.toString());
j.age = 13;
// j = new Person("gxw2", 12);
System.out.println(j.toString());
System.out.println("numberTest2:" + j.age);
// return i;
}
public static void main(String[] args) {
Integer i = 2;
String t = "gxw";
Person person1 = new Person("gxw", 11);
System.out.println("main1:" + person1.toString());
numberTest(person1);
System.out.println("main2:" + person1.toString());
System.out.println("main:" + person1.age);
}
}
class Person {
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
当numberTest方法中直接new一个对象,new出的j在会在堆中被分一个新地址,但是新地址不会覆盖原始地址,所以当在mian方法中输出person1的地址是不变的,而在numberTest中j的地址会改变。
当在numberTest方法中改变Person的属性时,由于在堆中的地址没变,变得只是属性,所以在main中person1的地址同样不变,并且在numberTest中j的地址也不变,但在mian和numberTest中输出age时,age的值会改变
果然在大学学的东西都还给老师了,真实瀑布汗,还得巩固基础知识啊