传参机制(极其重要!!!)
一、基本数据类型传参机制
结论:基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参
代码实例
public class practise {public static void main(String[] args){int a = 10;int b = 20;exchange method = new exchange();method.exchangemethod(a,b);System.out.println("main方法中的值:" + "a=" + a + " " + "b=" + b);}
}class exchange{public void exchangemethod(int a,int b){int temp = a;a = b;b = temp;System.out.println("类方法中交换后的值:" + "a=" + a + " " + "b=" + b);}
}
类方法中交换后的值:a=20 b=10
main方法中的值:a=10 b=20
分析
-
(1)方法调用完成后,栈空间释放,主栈中的值并未受到影响
-
二、引用数据类型传参机制
结论:引用数据类型传的是地址,形参影响实参
案例一
public class practise {public static void main(String[] args){person p = new person();p.age = 10;p.name = "jackson";b methodb =new b();methodb.test(p);System.out.println("main方法中的年龄为:" + p.age);}
}class person{int age;String name;
}class b{public void test(person p){p.age = 1000;}
}
main方法中的年龄为:1000
代码分析
-
(1)通过new
创建了一个person类
的一个对象p
,堆空间中申请一段空间,返回地址给p
,于是主栈中的p
指向堆空间中对象p
申请的一段空间
-
-
(3)这个时候方法对p.age
进行了修改,方法的栈空间释放,返回到主栈中,主栈中的p
找到堆空间中的age
,输出p.age
的值,即是方法中的p.age
的值

案例二(把案例一中的 b 方法修改为p == null
)
public class practise {public static void main(String[] args){person p = new person();p.age = 10;p.name = "jackson";b methodb =new b();methodb.test(p);System.out.println("main方法中的年龄为:" + p.age);}
}class person{int age;String name;
}class b{public void test(person p){p = null}
}
main方法中的年龄为:10
分析:p = null
这句话是对方法的栈空间有影响,对主栈并不会有影响(核心关键点)

案例三
public class practise {public static void main(String[] args){person p = new person();p.age = 10;p.name = "jackson";b methodb =new b();methodb.test(p);System.out.println("main方法中的年龄为:" + p.age);}
}class person{int age;String name;
}class b{public void test(person p){p = new person();p.age = 99;}
}
main方法中的年龄为:10
分析:虽然p
传进来了,但是方法中p
又指向了一个新的堆空间,并不指向主栈中的p
指向的堆空间,这个时候对主栈中的p
并不会有影响
注意:方法中p
指向创建的堆空间,方法执行后返回,这个堆空间并没有被引用,会被当作垃圾进行回收

总结:引用数据类型传递传的是地址,是否对主栈产生影响要看方法是否指向主栈中的堆空间并对主栈中堆空间的属性做出了修改