java值传递机制
java中方法的形参的传递机制:值传递机制
-
形参和实参的定义:
- 形参:方法定义时,声明在小括号里的参数
- 实参:方法调用时,实际传递给形参的数据
-
值传递机制:
-
如果参数是基本数据类型,此时实参赋值给形参的是实参真实存储的数据值
public class Test { public static void main(String[] args) { int i = 1; Test test = new Test(); test.add(i); System.out.println(i);// 1 } public void add(int i) { i = i + 1; System.out.println(i);// 2 } } //输出结果依次是:2,1
这是因为java的值传递机制,add()形参是基本数据类型,实参传递给实参的是数据值,不管add()方法里怎么操作这个值,都不会影响到 main()方法中的i,所以在main()中,调用add()后输出i的值仍然是1;
-
如果参数是引用数据类型,此时实参赋值给形参的是实参存储数据的地址值
public class Test { public static void main(String[] args) { Person person = new Person("Tom", 23); System.out.println(person); //Person [name=Tom, age=23] Test t = new Test(); t.change(person); System.out.println(person); //Person [name=Jerry, age=12] } public void change(Person p) { p.age = 12; p.name = "Jerry"; } } class Person { String name; int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } //重写toString() @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
在没调用change()之前输出person:name=Tom,age=23。因为change()的形参是引用数据类型,调用此方法时实参实际传递的是person的地址值,此时person和p指向堆空间里同一个对象,所以当change()里的p改变了这个对象的name(Jerry)和age(12)时,再次输出person,name就变成了Jerry,age就变成了12。
-