值传递

在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());
    }
}
posted @ 2021-01-24 20:39  小昊子丫  阅读(23)  评论(0编辑  收藏  举报