Java 值传递 or 引用传递 ?

1.结论

其实无需纠结答案是值传递还是引用传递,关键是理解它们的含义。如果一定要记住一个答案,那就认为是值传递(一切传引用其实本质上是传值)。

  • 我的理解:
    传递基本类型参数:改变形参(赋值操作)不影响实参
    传递对象(引用)类型参数:形参指向新的对象,则实参不改变;形参调用内部方法,实参改变

  • 解释:
    基本类型:变量中存储的是具体的值
    引用类型:变量中存储的是对象的地址,形参是变量的拷贝,指向同一个对象;此时若调用赋值操作,则指向新的对象,故实参对象不会改变;若调用内部方法,则改变的是同一个对象,即改变了参数对象。

public class TestParams {
    int a = 1;
    String str = "a";
    User user = new User("wei.zheng");

    public void test() {
        System.out.println("Before: a=" + a + ", str=" + str + ", user=" + user.toString());

        changeInt(a); // 不改变
        changeString(str); // 不改变
        changeUser(user); // 是修改对象属性,所以改变;若new新对象则不改变

        System.out.println("After: a=" + a + ", str=" + str + ", user=" + user.toString());
    }

    private void changeInt(int i) {
        i = 2;
    }

    private void changeString(String s) {
        s = "b";
    }

    private void changeUser(User u) {
        u.setName("justin"); // 修改属性,user实参会改变; 若 u = new ("justin")则user实参不改变
    }

    class User {
        private String name;

        public User(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
}

运行结果:

2020-03-01 11:05:37.803 29935-29935/? I/System.out: Before: a=1, str=a, user=User{name='wei.zheng'}
2020-03-01 11:05:37.803 29935-29935/? I/System.out: After: a=1, str=a, user=User{name='justin'}
  1. 基本类型传递,改变形参不影响实参;
  2. 对象类型传递,形参若指向新的对象(changeString方法),则实参不改变;形参若调用内部修改方法(changeUser方法),则实参改变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值