之前一直看到一个概念,面试题中也总是频频出现:java中的参数传递是值传递还是引用传递?答:值传递。
先从基本类型入手:
public class ChangePoint{
public static void main(String[] args) {
String aa="123";
String bb=new String("456");
rePoint(aa,bb);
System.out.println(aa);//123
System.out.println(bb);//456
rePoint2(aa,bb);
System.out.println(aa);//123
System.out.println(bb);//456
int i=12;
rePoint(i);
System.out.println(i);//12
}
/**
* 改变整数别名的指向
* @param i
*/
public static void rePoint(int i){
i=13;
}
/**
* 改变字符型别名的指向,指向常量字符串
* @param aa
* @param bb
*/
public static void rePoint(String aa,String bb){
aa="777";
bb="888";
}
/**
* 改变字符型别名的指向,指向字符串对象
* @param aa
* @param bb
*/
public static void rePoint2(String aa,String bb){
aa=new String("999");
bb=new String("000");
}
}
可以看到,无论是字符常量还是对象,只要是在方法中改变值的,都不能将值传递到方法外。
我们将实例换成对象:
public class TestBean {
private String name;
private String age;
public TestBean(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "TestBean [name=" + name + ", age=" + age + "]";
}
}
现在我们对这个bean做测试:
public class Properties {
public static void main(String[] args) {
TestBean bean=new TestBean("bob", "11");
rePoint(bean);
System.out.println(bean.toString());//TestBean [name=bob, age=11]
reField(bean);
System.out.println(bean.toString());//TestBean [name=anotherBob, age=11]
}
/**
* 改变bean的引用指向
* @param bean
*/
public static void rePoint(TestBean bean){
TestBean bean2=new TestBean("tom", "12");
bean=bean2;
}
/**
* 改变bean的域指向
* @param bean
*/
public static void reField(TestBean bean){
bean.setName("anotherBob");
}
}
可以看到,当我们直接改变对象引用的指向,方法外的引用并没有改变;而当我们通过这个引用操作对象中的域的时候,对象是改变了的;下面总结一下结论:
方法中参数实际上是原对象引用的一份拷贝,当我们对方法中的引用指向令外一个对象时,实际是将拷贝出来的地址指向另外一个对象:
因此,我们在方法内对参数的赋值,只是对拷贝的地址进行赋值;
那为什么改变参数指向的对象时,对象改变了?
方法结束,拷贝的地址被销毁,但是对象不会销毁,因此,方法外的对象真实的发生了变法。
总结
java方法中参数的传递是值传递。只是有些人喜欢叫它引用传递而已。最近看到项目中代码出现这个bug,由于对象没有正确返回,出现了大量nullPointerException,就总结了一下,希望有所帮助