问:Java是值传递?还是引用传递?
答:Java只有值传递
例子:
1,入参为基础数据类型时
package com.company;
public class Main {
public static void main(String[] args) {
int i = 0;
System.out.println("main()改变前:"+i);
change(i);
System.out.println("main()改变后:"+i);
}
public static void change(int i){
i = 1;
System.out.println("change()改变后:"+i);
}
}
结果:
main()改变前:0
change()改变后:1
main()改变后:0
2,入参为引用数据类型一时
package com.company;
public class Main {
public static void main(String[] args) {
String i = "a";
System.out.println("main()改变前:"+i);
change(i);
System.out.println("main()改变后:"+i);
}
public static void change(String i){
i = "b";
System.out.println("change()改变后:"+i);
}
}
结果:
main()改变前:a
change()改变后:b
main()改变后:a
3,入参为引用数据类型二时
package com.company;
import com.basis.entity.Info;
import com.basis.entity.Person;
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setAdress("北京");
Info info = new Info();
info.setIDCard("111");
info.setName("马师");
person.setInfo(info);
System.out.println("main()改变前:"+person);
change(person);
System.out.println("main()改变后:"+person);
}
public static void change(Person p){
p.setAdress("上海");
Info info = p.getInfo();
info.setIDCard("222");
info.setName("法老");
p.setInfo(info);
System.out.println("change()改变后:"+p);
}
}
结果:
main()改变前:Person{adress='北京', info=Info{IDCard='111', name='马师'}}
change()改变后:Person{adress='上海', info=Info{IDCard='222', name='法老'}}
main()改变后:Person{adress='上海', info=Info{IDCard='222', name='法老'}}
分析:
通过三个例子,貌似得不出Java只有值传递的结论,第三种的引用类型中的值也发生了改变,这是怎么回事?
因为当入参为引用类型时,传递的其实是对象的引用地址。
虽然对象内的变量值发生了改变,但是对象的引用地址一直没有发生变化,