java中值传递以及引入传递相关问题记录

一:值传递

解释:实参传递给形参的是值  形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参

代码示例如下:

复制代码

package arrayDemo;
public class Demo1 {
        public static void main(String[] args) {
                int b =20;
                change(b);// 实参  实际上的参数
                System.out.println(b);
        }
        public static void change(int a){//形参  形式上的参数
                a=100;
        }
}

复制代码

结果:20

为什么?看下面分析:

 

通俗的讲法就是:形参只是实参创建的一个副本,副本改变了,原本当然不可能跟着改变

再来解释引用传递

二:引用传递

实参传递给形参的是参数对于 堆内存上的引用地址 实参和 形参在内存上指向 了同一块区域  对形参的修改会影响实参

 

复制代码

package arrayDemo;
public class Demo1 {
        public static void main(String[] args) {
                int [] a={1,2,3};
                System.out.println(a[0]);
                change(a);
                System.out.println(a[0]);
        }
        public static void change(int[] a ){
                a[0]=100;
        }
}

复制代码

结果:1        100

为什么?

由于引用传递,传递的是地址,方法改变的都是同一个地址中的值,

原来a[0]指向0x13地址,值是1,

后来在a[0] 指向的也是0x13地址,将值变成了100

所以,再查询a[0]的值的时候,值自然变成了100

转摘自:https://www.cnblogs.com/ncl-960301-success/p/10574701.html

亲身实践:

public class ParamTest {

    public static void main(String[] args) {
        Object obj =new Object();
        System.out.println(obj);
        test(obj);
        System.out.println(obj);

    }

    static void test(Object obj){
        obj =  new ArrayList();
        System.out.println(obj);
    }
}

结果输出:

项目中遇到:

37 more####Caused by: java.lang.ClassCastException: java.lang.Object cannot be cast to java.util.List####  

梳理:

1: 先定义Object extraInfo = new Object(); 然后将实参:extraInfo 传递给init(..., Object extraInfo) 形参,
2: 在init() 方法中对形参:extraInfo 重新赋值:extraInfo = unionPlanFundsCustAttributes;

3:调用完init() 方法后,然后调用childPoolSort(...., Object extraInfo) 方法,将extraInfo 作为形参传递到该方法,然后进行强制类型转换:

List<UnionPlanFundsCustAttribute> unionPlanFundsCustAttributes = (List<UnionPlanFundsCustAttribute>)extraInfo;在此次抛出的转换异常

分析:

1:在将Object extraInfo = new Object()传递给init() 方法的参数上,实际上是将 new Object() 对象的堆内存地址传递给方法,而不是将Object extraInfo  变量传递进入

2: 然后在init()方法中重新赋值:extraInfo = unionPlanFundsCustAttributes; 其实是操作的形参,外面的实参没有影响

3:调用childPoolSort(...., Object extraInfo) 方法,也是实际上将new Object() 对象的堆内存地址传递给方法,

所以会转换异常

解释:实参传递给形参的是值  形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值