值传递
在java中,基本数据类型传递的就是他的数据,引用类型传递的是他的地址。
因此,当A方法传递一个基本数据类型到B方法时,在B方法中无论怎么修改这个值都不会改变A方法中的值,B中修改的值随着B方法结束运行被弹出栈,不会影响到A方法中的值
public class PassTest {
public static void main(String[] args) {
int a=1,b=2;
change(a,b);
System.out.println(a+" "+b);
}
private static void change(int a,int b){
int temp=a;
a=b;
b=temp;
}
}
当A方法传递一个引用数据类型到B方法时,B方法根据传过来的地址找到在堆中存放的对象,去修改其中的数据,B方法弹出栈时,这个修改在堆中还是真实有效的
注意:B中获取到的地址值是A中的地址值复制了一份到B中的,这是占用了两块内存的相同的地址值
class User{
int id;
public User(int id){
this.id=id;
}
}
public class PassTest {
public static void main(String[] args) {
User user=new User(1);
change(user);
System.out.println(user.id);
}
private static void change(User user){
user.id=2;
}
}
当A方法传递一个String到B方法时,B方法赋值给这个String,实际上是新建了一个字符串对象(如果字符串常量池里没有这个值的话),B中地址值就变成了新的对象的地址,跟A里的地址已经是两个对象了
public class PassTest {
public static void main(String[] args) {
String s="a";
System.out.println(s.hashCode());
change(s);
System.out.println(s);
System.out.println(s.hashCode());
}
private static void change(String s){
s="b";
System.out.println(s.hashCode());
}
}