一:值传递
解释:实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参
代码示例如下:
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() 对象的堆内存地址传递给方法,
所以会转换异常
解释:实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参