java到底是值传递还是地址传递,网上说什么都有,面试的时候我也说不清,我让面试官举例子,我直接说结果,面试官说算了!
好了,回到正题,具体似乎什么传递我也说不清,举几个例子说明一下。
1.基本类型,包装类型和特殊类型
public static void changeValue(String str,int a,Integer b){
str="a";a=11;b=128;
}
public static void main(String[] args) {
String str="A";
int a=1;
Integer b=127;
changeValue(str,a,b);
System.out.println("最后输出结果 str:"+str+",int a:"+a+",Integer b:"+b);
}
最后输出结果 str:A,int a:1,Integer b:127
由以上结果可以得知:基本类型和包装类型以及str都不会改变
2.传递对象
public static void changeValue(User user){
user.setA(22);
user.setB(128);
user.setName("aaa");
}
public static void main(String[] args) {
User user=new User(1,"A",127);
changeValue(user);
System.out.println("最后输出结果 str:"+user.getName()+",int a:"+user.getA()+",Integer b:"+user.getB());
}
最后输出结果 str:aaa,int a:22,Integer b:128
由以上结果可以得知:如果是对象,则会改变!
public static void changeValue(User user) {
user = new User();
user.setA(22);
user.setB(128);
user.setName("aaa");
}
public static void main(String[] args) {
User user = new User(1,"A",127);
changeValue(user);
System.out.println("最后输出结果 str:" + user.getName() +
",int a:" + user.getA() + ",Integer b:" + user.getB());
}
最后输出结果 str:A,int a:1,Integer b:127
由以上得知:如果传递的对象,对象的引用重新被赋予对象的话,不会改变!
总结:
对象类型传的是对象的引用,实则传递的是对象地址,然后重新给地址赋值,所以会改变,而在第三个例子中,传递的引用被赋予了另外一个对象,后面引用操作的是新的对象地址,我们在changeValue外面打印的是传入的地址,即旧对象地址,所以不会改变!
基本类型不会改变,对象传的会不会改变主要看是否被重新赋予新的地址!
以上只是个人的理解!