带你看清 java的值传递和引用传递

有很多人看不懂java值传递还是引用传递,可能因为参数传递导致问题,而java参数传递本质是赋值。今天带你简单看下java参数传递。

 

一、.基本类型参数传递

这样形参传递

public static void main(String [] args) {
    int a = 1;
    test(a);
    System.out.println(a);
}
static void test(int p){
    p = 3;
}

结果:a=1,方法并没有改变a的值。

实际过程是这样的

public static void main(String [] args) {
    int a = 1;
    int p = 0;
    p = a;
    p=3;
    System.out.println(a);
}
结果 :
1

这样看清楚了么?

a的值没用被改变非常正常。

 

2.引用类型参数传递

public static void main(String[] args) {
    ArrayList<String> s = new ArrayList();
    Collections.addAll(s, "1", "2", "3");
    test(s);
    System.out.println(s.size());
    test2(s);
    System.out.println(s.size());
}

    public static void test(ArrayList<String> p) {
        p.add("4");
    }
    public static void test2(ArrayList<String> c) {
        c=null;
    }
结果:
4
4

第一次 s的值被改变了,第二次 s的值未被改变,为什么呢?

实际上代码的过程可以看成是这样

public static void main(String[] args) {
    ArrayList<String> s = new ArrayList();
    Collections.addAll(s, "1", "2", "3");
    ArrayList<String> p = null;
    p = s;
    p.add("4");
    System.out.println(s.size());
    p=null;
    System.out.println(s.size());
}

结果:
4
4

所以,java参数传递本质是赋值。因为每个方法在栈中都是一个栈帧,里面保存自己的变量,所有参数传递的本质就是把上个方法所要传的的参数 赋值给新的方法参数。 

而赋值的本质是copy一个副本。基本类型copy基本类型的参数,引用类型copy引用参数再堆中的实际地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值