一、基本数据类型
- 基本数据类型采用值传递的模式,形参的改变不影响实参。
public class MethodParameter01 {
public static void main(String[] args){
int a = 10;
int b = 20;
AA t = new AA();
t.swap(a, b); //基本数据类型,传递的是值(值拷贝),形参的改变不影响实参
System.out.println("在main中,swap(int a, int b)后, a=" + a + " b=" + b); //打印main空间里面的局部变量
}
}
class AA {
public void swap(int a, int b){
System.out.println("在swap中,交换前的值,a=" + a + ", b=" + b);
//交换的是swap栈空间里面的局部变量
int tmp = a;
a = b;
b = tmp;
System.out.println("在swap中,交换后的值,a=" + a + ", b=" + b);
}
}
代码运行结果:
在swap中,交换前的值,a=10, b=20
在swap中,交换后的值,a=20, b=10
在main中,swap(int a, int b)后, a=10 b=20
一图胜千言:
分析:在swap()
里面修改的是swap
栈里面的局部变量,不会改变main
栈里面的局部变量。
二、引用数据类型
- 引用数据类型,采用引用传递,传递的是地址,形参可以通过实参传递的地址来修改该内存地址里面存储的数据。
- 地址值本身是值传递,当形参变量指向的内存地址值发生改变时(指向一块新的内存空间),不会影响实参的值,实参的指向不变。类比C/C++,修改一个变量的值,需要传递该变量的内存地址。
public class MethodParameter03 {
public static void main(String[] args){
Person p = new Person();
p.age = 10;
p.name = "jack";
ChangeInfo x = new ChangeInfo();
x.changeAge(p);
System.out.println("p.age=" + p.age);
x.changeName(p);
System.out.println("p.name=" + p.name);
}
}
class Person {
int age;
String name;
}
class ChangeInfo {
public void changeAge(Person p){
//p接受地址,地址值本身是值传递,通过地址访问对象所在的内存空间,进而修改数据
p = null; //将changAge栈空间里面的变量p置为null,不影响main空间里面的变量p
}
public void changeName(Person p){
p.name = "pony"; //通过地址访问到内存,并修改内存数据
}
}
代码运行结果:
p.age=10
p.name=pony
画图分析:
- 执行
x.changeAge(p);
。changeAge
栈里面的变量p
接受main
栈传递来的地址值,之后changeAge
栈里的变量p被修改,但是不会修改main
栈里的p
即指向不变,因为main
栈和changeAge
栈是互相独立的。简单来说,main
函数给changeAge
函数传递的是p
变量的值,而不是p
变量的地址,所以在changeAge
里面修改p
变量的值不会影响main
里面p
的值。
2. 执行x.changeName(p);
。changeName
栈的变量p
接受main
栈传来的地址,并通过该地址访问到对应的内存空间,修改该地址空间存储的name
变量的值。然后main
栈里面的变量p
访问该地址空间存储的数据时,读取到的数据就是修改后的。同理,传递的是age
变量和name
变量所在的内存地址,通过地址修改变量的值。