public class Problem01 {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
A a3 = new A();
System.out.println(a1 + " " + a2);
swap(a1, a2);
System.out.println(a1 + " " + a2);
System.out.println(a3.a);
assignment(a3);
System.out.println(a3.a);
}
private static void swap(A a1, A a2) {
A a = new A();
a = a1;
a1 = a2;
a2 = a;
System.out.println(a1 + " " + a2);
}
private static void assignment(A aa) {
aa.a = 8;
}
}
class A {
int a = 10;
}
代码运行结果
在java里传参传递的都是值:
- 基本数据类型传递的是数据的值。调用者(方法体外部)和被调用者(方法体内部)用的是两个不同的变量,方法体内部的变量的改动不会影响方法体外部的变量。
- 引用数据类型传递的是所引用的对象的地址的值。调用者(方法体外部)和被调用者(方法体内部)用的是两个相同的变量,方法体内部变量的改动会影响方法体外部的变量。
java程序设计语言总是采用按值调用,方法得到的所有参数值都是变量的拷贝。基本数据类型传递的是数据本身的拷贝,引用类型传递的是引用所对应对象的地址的拷贝。
数据传参想必大家都很熟悉了,那就看一下数据类型的引用传参。在assignment()方法体中传入的参数不是基本数据类型,是A类型的一个实例,从输出结果可以看到a的值发生了变化。
再来看看引用传参。上面代码中swap(a1,a2)开始传递参数的时候,在swap方法的栈内存中就会出现方法外部对象a1和a2的所引用对象的地址值的复制体a1和a2.这时进行交换操作,致使方法体内部的a1实际引用的是外部的a2,内部的a2实际引用的是外部的a1。所以方法体内部打印a1和a2所引用的对象的值和外部的a1和a2是相反的,并且,外部的a1和a2的值在调用swap方法前后所引用的对象并没有变化。
总结:
- 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)。
- 一个方法可以改变一个对象参数的状态。
状态是指对象的实例域,比如,上面的a3.a就被改变了。 - 一个方法不能让对象参数引用一个新的对象。
比如,上面的swap()方法就没改变a1和a2的引用对象。(但是不经过方法,直接在main()方法里用赋值语句就可以改变)
网友评论