引言
Java中的对象是值传递还是引用传递?
我个人认为,如果没有学习过c++的小伙伴,对引用这个概念可能只有JAVA的4种引用类型和引用队列这个概念。那么参数的传递是引用还是值传递呢?
想看C++的往这看 c++ 左值 右值 拷贝构造 移动构造
基本编程入门大家都学过最简单的语言:C语言(语法简单,函数式编程,无面向对象),其中相信大家都接触过指针和引用这2个类型,这里为什么说到C语言,因为这2种参数传递类型对下面的内容有些用处。在JAVA中对象参数的传递到底是引用还是值传递?
对象值传递猜测
首先,如果是值传递,为了不影响之前传进来的实参本体,那么一定会出现临时变量。也就是说,不管我们在方法内如何修改这个对象,被传进来的对象本体是不会有任何改变的。
class User{
private String name;
public String getName(){ return this.name; }
public void setName(String name){ this.name = name; }
}
User user = new User();
user.setName("张三");
System.out.println(user.getName());
change(user);
System.out.println(user.getName());
void change(User user){
user.setName("李四");
}
如果是值传递,那么在
change(user);
System.out.println(user.getName());
这个时候,输出的应该还是张三,而不是李四,因为传递参数会拷贝一份临时变量。方法内对user对象的所有修改,都不会对实参本体造成任何影响。
但显然,Java 中产生了影响,所以对象本身的值传递排除。
对象引用传递猜测
class User{
private String name;
public String getName(){ return this.name; }
public void setName(String name){ this.name = name; }
}
User user = new User();
user.setName("张三");
System.out.println(user.getName());
delete(user);
System.out.println(user.getName());
void delete(User user){
user = null;
}
如果是引用传递,那么在
delete(user);
执行后
System.out.println(user.getName());
打印应该会报空指针异常,因为引用传递后,我们在delete中将user赋值为了null.
但是Java中明显没有出现这个错误,那么对象本身的引用传递也排除了。
思考
对象本身值传递被排除,引用传递也被排除,那到底是什么传递?
有没有想到C语言中的指针呢?
我们可以不可以认为,Java中对象的参数传递,实际上就是对象引用的一个副本,你可以使用它来调用对象方法,修改对象中的成员变量,但无法对对象本体做修改。
总结
那么总结下来就是Java中对象的参数传递,还是值传递,只不过不是对象的副本,而是对象引用的副本。