据说这是java中最重要的东西,没有之一,哈哈。
public class Home {
Cat cat;
public static void main(String[] args) {
Home home = new Home();
Cat mimi = new Cat();
mimi.name = "咪咪";
home.cat = mimi;
}
}
像上面声明的home实例,他指向的是一个地址,地址指向的内存中存储着真正的内容。

改写一下代码,声明两只猫:
home.cat1 = mimi;
home.cat2 = mimi;
此时家中的两只猫是同一只猫吗?他们占据的是一个内存空间还是两个呢?答案是一个。因为cat1和cat2都被赋予了同一个地址值。由此引出了深拷贝和浅拷贝的问题。
public class Copy {
public static void main(String[] args){
Home home = new Home();
Cat cat = new Cat();
Home.cat = cat;
cat.name = "咪咪";
deepCopt(home);
}
public deepCopy(Home home){
Home newHome = new Home();
Cat newCat = new Cat();
String newName = new String(home.cat.name);
newCat.name = newName;
newHome.cat = new Cat();
return newHome();
}
}
方法的传值,传引用
传值
public static void main(String[] args){
int i = 0;
addOne();
}
public int addOne(int i){
i = i + 1;
}
在执行addOne后,main方法中的i仍然是0,这是因为在执行addOne方法时创建了一个新的执行环境,新的环境中将传递的实参赋值给了这个新的环境中,此时执行+1操作操作的时新环境中的变量,而不是main函数中的,并且函数执行完毕后整个环境会被销毁。
传引用
public static void main(String args){
Cat cat = new Cat();
cat.name = "老二";
renameCat(cat);
}
static void renameCat(Cat cat){
cat.name = "大傻子";
}
此时cat的name会被更改为大傻子,而不是老二。这是因为传递的是地址值,这个地址指向的内容被修改了,所以会体现在原来的类上面。