栈存放基本类型的变量、引用;堆存放对象。
1. 首先我们要分清楚对象和引用的概念,这很重要;
class Person{
String name;
Person(){
}
Person(String name){
this.name = name;
}
public static void changeName(Person person,String newName){
person.name = newName;
}
public static void changeName2(Person person,String newName){
person = new Person(newName);
}
}
我们写一个Person类;
Person me = new Person("zlz")
我们呢要知道,new Peron("zlz") 这个是在堆中创造了一个对象,而me只是它的一个引用而已。只要我愿意,我可以创建无数个它的引用。而这些引用时互相独立的,但是都指向同一个对象。所以又有着关系。
他们的联系体现在
Person p1 = new Person("zlz");
Person p2 = p1;
Person.changeName(p1,"zly");
System.out.println(p2.name);
输出: zly
他们的独立性在于
Person p1 = new Person("zlz");
Person p2 = p1;
Person p3 = new Person("xswl");
p2 = p3;
Person.changeName(p1,"zly");
System.out.println(p2.name);
输出:xswl
在java函数中其实就是这样,在静态方法changeName2中实际上进行了这样的操作:
Person.changeName2(p1,"zly");
结合changeName2函数内容上面这句话等价于===》
person newReference = p1;
newReference = new Person("zly");
可以看到,实际上,在函数内部新建立了一个相同的引用,如果在这个引用上修改,那么被修改的对象所有的引用都能看的到这些改动,但是如果是将引用指向新的对象,那么实际上传入的引用依然指向原来的对象,原来的对象啥也没变。
注意这个newReference的作用,实际效果等于函数内部拷贝了引用,中间指向其他对象的话和p1无关。
在函数内部的p1其实已经不是p1了,而是内部新建的newReference.