Java参数传递新认识

前言

网上好多关于java参数传递的解释,有的说是值传递,也有说是引用传递,还有说都有的。我今天就另辟蹊径谈谈我自己的看法。不管它是值传递还是引用传递,我们应该关注传递过来的参数是怎么被我们使用的。

往下看

1、先用基本类型做一个实验:
    @Test
    public void test1() {
        int i = 5;
        System.out.println("改变前i的值" + i);
        changeInt(i);
        System.out.println("改变后i的值" + i);
    }

    public void changeInt(int nextI) {
        nextI = 10;
    }

输出结果:

改变前i的值5
改变后i的值5

改变前后的结果并没有变化。我们看changeInt(int nextI)这个方法中的参数,前面类型int,其实jvm内部帮我们做了一个暗箱操作:

// 也就说在栈内存中定义了另一个int类型的变量nextI并把i的值赋给它
int nextI = i;

我们将代码修改一下:

 @Test
    public void test1() {
        int i = 5;
        System.out.println("改变前i的值" + i);
        int nextI = i;
        nextI = 10;
        System.out.println("改变后i的值" + i);
    }

这段代码相信大家一眼就看明白了,可是为什么传递到方法里就懵了呢。我们继续看下面的例子。

2、再用String类型做一个实验
  @Test
    public void test2() {
        String a = "hello";
        System.out.println("改变前i的值" + a);
        changeString(a);
        System.out.println("改变后i的值" + a);
    }

   public void changeString(String str) {
        System.out.println("传递的str长度为" + str.length());
        str = "123";
        System.out.println("改变后的str长度为" + str.length());
    }

输出结果:

改变前i的值hello
传递的str长度为5
改变后的str长度为3
改变后i的值hello

显然跟int的结果是一致的,相信到此你应该有所感悟了,那好我们继续改造下代码:

  @Test
    public void test2() {
        String a = "hello";
        System.out.println("改变前i的值" + a);
        String str = a;
        System.out.println("传递的str长度为" + str.length());
        str = "123";
        System.out.println("改变后的str长度为" + str.length());
        System.out.println("改变后i的值" + a);
    }

看,相当于我把抽取的方法又打散到了代码中,总之就是一句话:传递的参数会被赋值给方法括号中那个新的对象,还是不明白?那我接着往下看。

3、最后一个实验使用对象
  @Test
    public void test() {
        People p = new People("zhangs", 30);
        System.out.println("改变前的people" + p);
         changePeople(p);
        System.out.println("改变后的people" + p);
    }

    public void changePeople(People people) {
         people.setAge(25);
    }

输出结果:

改变前的peoplePeople{name=‘zhangs’, age=30}
改变后的peoplePeople{name=‘zhangs’, age=25}

这次我们成功的改变了people的属性值,怎么会这样呢?那我们再次改造代码:

 @Test
    public void test() {
        People p = new People("zhangs", 30);
        System.out.println("改变前的people" + p);
        People p2 = p;
        p2.setAge(25);
        System.out.println("改变后的people" + p);
    }

结果跟上面是一样的,这样看是不是通俗易懂,其实方法传递的时候就是帮我们做了一个赋值操作:People p2 = p;
我们拿people这个对象再做一个实验:

  @Test
    public void test() {
        People p = new People("zhangs", 30);
        System.out.println("改变前的people" + p);
        changePeople(p);
        System.out.println("改变后的people" + p);
    }

    public void changePeople(People people) {
        people = new People("lsii", 15);
    }

输出结果:

改变前的peoplePeople{name=‘zhangs’, age=30}
改变后的peoplePeople{name=‘zhangs’, age=30}

看到了吧。我们并没有改变这个对象哦。到此应该明白了吧。
最后再强调这句话:传递的参数会被赋值给方法括号中那个新的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值