这个问题是个十分基础的问题,但有时越是基础的问题越容易被忽略,我们经常在Java程序中使用“=”符号或者向方法中传入实参,那么通过“=”或传入参数的操作联系起来的两个对象在后续的各种操作中是否有影响?这应该是我们必须弄清楚的一点。
我们暂且先将要讨论的变量分为两类:基本类型和引用类型。
1、 首先需要清楚基本类型和引用类型的区别
int n = 10;
String s = "hello";
上面声明了两个变量:n、s,我们知道n是基本类型,s是引用类型,他们所包含的含义是截然不同的:n的值‘10’直接保存在这个变量中,而s指向的内容‘hello’保存在一块内存的某个位置中,s本身的值是指向这块内存起始位置的地址。
1、 然后要清楚“=”的作用
int n = 10;
String s = "hello";
n = 20;
s = "HELLO";
对于基本类型,“=”可以直接改变变量的值,而对于引用类型,“=”的作用是改变变量的地址的值,将变量指向另一个地址(对象)。
所以n的值直接由‘10’覆盖为‘20’,s的值由‘hello’的地址改变为‘HELLO’的地址。这里我们需要注意s原来指向的对象‘hello’并没有被覆盖,是s指向了另一个对象,以后‘hello’的事情与s就无关了。
1、 调用方法时的参数传递
void change(int val){
val = 100;
}
int val = 10;
change(val); //val变量仍是10,不变
void change(String s){
s = "HELLO"
}
String s = "hello";
change(s); //s的值不变,仍是hello
通过上面的代码,我们发现参数传递基本等同于“=”,为了方便理解,我们可以这样去理解参数传递:
void change(int val){
val = 100;
}
int val = 10;
change(val); //这一步我们试图像下面这样理解
|
|
\ /
`
change(int val){
int cpVal = val; //假设为一个值的拷贝
cpVal = 100; //cpVal的值变为100
}
同样,引用类型s执行change方法时也可以想象为:
change(String s){
cpStr = s; //通过“=”指向同一个对象‘hello’
cpStr = "HELLO"; //通过“=”又指向另一个对象‘HELLO’
}
由上面的代码我们知道,参数传递基本等同于“=”的作用,基本变量的“=”赋值运算符是复制一个类型相同的变量,函数中的操作都是针对被复制的变量,与传递进去的变量没有影响;
引用变量通过参数传递,在方法中复制一个变量,这个变量通过“=”复制运算符将两者联系起来,复制的变量是指向原变量指向的对象的地址,除非又将复制的变量指向其他对象,则在方法中的操作会影响到原变量指向的对象,因为两者指向同一个对象。