传参机制(极其重要!!!)
一、基本数据类型传参机制
结论:基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参
代码实例
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)方法调用完成后,栈空间释放,主栈中的值并未受到影响
-
(2)换个角度看,输出的是 main 方法中的a和b的值(即在主栈中执行的输出语句)
二、引用数据类型传参机制
结论:引用数据类型传的是地址,形参影响实参
案例一
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申请的一段空间
-
(2)通过new创建了一个b类的一个对象methodb,调用b类中的方法,此时会在申请一段栈空间用于方法的调用,由于传递的参数是引用类型p(传的是地址),此时方法中的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指向创建的堆空间,方法执行后返回,这个堆空间并没有被引用,会被当作垃圾进行回收

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