java为什么是值传递而不是引用传递?

最近在刷面试题的时候,遇见了一个问题:java是值传递还是引用传递?虽然知道是值传递,但是也说不出个所以然来。因此我浏览的很多博客以及StackOverflow想看看大佬们是怎么想的。通过自己的整理。我下面来说一下,如果有说错的地方,还请大佬们指出。

 要想解决java为什么是值传递而不是引用传递。首先我们要先了解几个概念:

实参:

 实参就是实际参数,指的是调用有参方法的时候传入的真正的值。

形参:

形参就是形式参数,指的是被调用的中接收实参内容的参数

请看下面例子:
 

public class Main {
 
    public static void main(String[] args) {
        String t = "张三";
        doWithSomeThing(t); //这里的t就是实参
    }
    
    public static void doWithSomeThing(String name){ //这里的name 就是形参
        
    }
}

下面我介绍一下什么是值传递和引用传递

值传递:值传递就是在函数调用的时候,把实参复制一份传给函数,这样如果在函数中对参数进行修改的话,不会影响到实际参数。

引用传递:而引用传递就是在函数调用的时候,把实际参数在内存中的地址直接传给函数,这样如果函数中对参数进行修改的话,就会影响到实参的值。

 

有人说  java是引用传递,比如看下面的代码
 

public class Main {
 
    public static void main(String[] args) {
      User user = new User();
      user.setName("张三");
      doWithSomeThing(user);
        System.out.println(user);
    }
 
    public static void doWithSomeThing(User person){
        person.setName("李四");
        System.out.println(person);
    }
}

输出结果

 

User的name不是改变了么?java应该是引用传递。

又有些人说 不对不对 下面的例子可以证明 java应该是值传递

public class Main {
 
    public static void main(String[] args) {
      int i =3;
      doWithSomeThing(i);
        System.out.println(i);
    }
 
    public static void doWithSomeThing(int j){
        j=4;
        System.out.println(j);
    }
}

结果:

你看,方法里面改变了参数的值,但是原来的值并没有改变。所以java是值传递。

 

众说纷纭,,最后有人说,这不就是如果参数是对象的话就是引用传递,如果是普通类型的时候就是值传递。

但是请看

public class Main {
 
    public static void main(String[] args) {
        String t = "张三";
        doWithSomeThing(t);
        System.out.println(t);
    }
 
    public static void doWithSomeThing(String name){
        name = "李四";
        System.out.println(name);
    }
}

结果

你能告诉我 String 是个普通类型么? 很显然 我们都陷入了一个误区

改变,改的是什么

套用 “程序员小灰”的例子 (很棒的博主,还有微信公众号哦!)

你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。

 

你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。

 

但是你朋友用上面哪个方法 有了你家的钥匙,进到你家把电视砸了。 会不会有影响呢?肯定会。这个砸电视的动作,就好比setName()操作一样 

改变的不是钥匙,而是钥匙打开的房子

 

当调用doWithSomeThing 方法的时候,并且user作为实参传给形式参数person 这时候是把user的地址(比如是0x123456)作为值传给形参。这个时候person所指的地址也是0x123456 ,然后在dowithSomeThing方法内对参数进行修改的时候,会重新开辟一块内存,

所以,值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值