形参:定义方法时方法参数列表上的变量
实参:调用方法时传进去的具体值
1.引用数据类型作为参数,形参的改变会影响实参的值(String类与包装类除外)
引用数据类型作为参数 --------- 参数值保存在堆内存空间中,而栈内存中的对象则保存参数值在堆内存空间中的地址值
原理分析:
1.程序执行时,main方法首先进入栈内存空间;
2.实例化数组对象后,在堆内存中开辟一个整型数组空间,默认值为0,同时将地址值传给栈内存中的对象;
3.执行change方法时,形式参数传入change方法中的是数组在堆内存中的地址值,对数组重新赋值;
4.change方法执行完毕后,弹出栈内存空间,随之消亡的是传入方法体中的地址值;
5.回到main方法,执行输出语句,因为数组的地址值并未改变,传出的是数组重新赋值后的值,即arr[0]=100,arr[1]=200;
6.main方法执行完毕,弹出栈内存空间。
public class ParameterDemo{
public static void change(int[] arr){
arr[0] = 100;
arr[1] = 200;
}
public static void main(String[] args){
int[] arr = new int[]{10,20};
change(arr);
System.out.println(arr[0]); //100
System.out.println(arr[1]); //200
}
}
引用数据类型的特殊情况:String类与包装类
包装类:
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
String类:直接赋值。值是保存在方法区的常量池中,方法中的局部变量保存字符串在常量池中的地址值。内容相同的字符串只存一份,并且值不可改变。若重新赋值相当于重新创建了一个新的变量。
原理分析:
1.程序执行时,main方法首先进入栈内存空间;
2.字符串类型的变量a,b存储在栈内存中。变量a,b的值存储在方法区的常量池中,并将各自的地址值传给变量a,b。
3.执行change方法,change方法进入栈内存中,变量a,b作为形式参数传入change方法中,对a,b变量重新赋值即是在常量池中寻找/创建唯一值,并将地址值传给形式参数a,b;
4.change方法执行完毕,弹出栈空间,形式参数作为局部变量也随之消亡;
5.执行打印语句,输出main方法中的实际参数。发现变量值并未改变。
public class ParameterDemo{
public static void change(String a,String b){
a = "一笑倾城";
b = "二笑倾国";
}
public static void main(String[] args){
String a = "persistent";
String b = "believe";
change(a,b);
System.out.println(a); //persistent
System.out.println(b); //believe
}
}
2.基本数据类型作为参数,形参的改变不会影响实参的值
基本数据类型作为参数 ---------- 参数值保存在栈内存空间中,随各自方法的产生而产生,随各自方法的消亡而消亡。
原理分析:
1.程序执行时,main方法首先进入栈内存空间;
2.之后作为实参的局部变量a=10,b=20加载进main方法中;
3.之后执行change方法语句,将实参a=10,b=20传入change方法中,之后对形参重新赋值a=100,b=200;
4.change方法执行完后,弹出栈内存空间,形参a=100,b=200也随之垃圾回收;
5.回到main方法,执行输出语句,将main方法中的实参a=10,b=20打印出来。
6.程序结束,main方法弹出栈内存空间。
public class ParameterDemo{
public static void change(int a,int b){ //静态方法体内部的参数:a,b为形参
a = 100;
b = 200; //对形参赋值
}
//main测试类
public static void main(String[] args){
int a = 10;
int b = 20; //此处的a,b为实参
change(a,b); //形参a,b的值在方法体内部改变
System.out.println(a); //10
System.out.println(b); //20
}
}