Java中的参数传递方式

1.值传递和引用传递

值传递:实参将自身的值拷贝一份传递给方法作为参数,在方法中对形参的修改不会影响到实参的数值。

引用传递:方法接受的实际是实参的地址值,在方法中的操作会直接根据地址找到实参并修改实参的值。

2.Java中的参数传递

很多程序设计语言(C++等)使用了上面提到了两种参数的传递方式,但是在Java中,只有值传递

a) 基本类型,基本类型的包装类,String类的参数传递:

 public static void main(String[] args) {
        int a=10;
        Integer b=10;
        String s="aaaa";
        doTest01(a,b,s);
        System.out.println(a);
        System.out.println(b);
        System.out.println(s);
}
//基本类型,基本类型的包装类,String类的参数传递实际为值的拷贝
public static void doTest01(int a, Integer b, String s){
        a=a+10;
        b=b+10;
        s=s+"123";
}

测试结果:

结论:一个方法不能修改一个基本类型的参数。基本类型,基本类型的包装类,String类的参数传递实际为值的拷贝,修改的是实际值的副本,除非在外面赋值。

b) 改变对象参数的状态

public static void main(String[] args) {
        Test01 test01 = new Test01();
        test01.setAge(10);
        System.out.println("修改之前的age是:   "+test01.getAge());
        doTest02(test01);
        System.out.println("修改之后的age是:   "+test01.getAge());
}
//修改对象参数的值
public static void doTest02(Test01 test01) {
        test01.setAge(20);
}

测试结果:

结论:对象参数实际传递的是实参对象地址的拷贝,实参和形参此时保存的地址值相等,指向同一个地址,对形参的改变会直接影响实参的值。

c) 对象引用是否为引用传递

b的测试结果看上去更像是引用传递,即形参是引用的实参而不是实参的地址值副本。实际上,这种理解是不对的。

public static void main(String[] args) {
        Test01 t1=new Test01();
        Test01 t2=new Test01();
        t1.setAge(10);
        t2.setAge(20);
        System.out.println("交换之前t1的age是:  "+t1.getAge());
        System.out.println("交换之前t2的age是:  "+t2.getAge());
        exchange(t1,t2);
        System.out.println("交换之后t1的age是:  "+t1.getAge());
        System.out.println("交换之后t2的age是:  "+t2.getAge());
}
//对象的互换
public static void exchange(Test01 t1, Test01 t2) {
        Test01 test01 = t1;
        t1 = t2;
        t2 = test01;
}

测试结果:

如果Java对对象采用的是引用传递,那么这个方法就应该能够实现交换数据的效果。但是,方法并没有改变存储在变量t1和t2中的对象引用,这个方法交换的是这两个对象引用的拷贝。

                 黑色是实参地址值,绿色是形参地址值,红色是形参交换后的地址值

 

参考资料:Java核心技术 卷1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值