-
- 概念的引出
- 示例代码
1.概念的引出
在java的操作符中,有“=”一种操作符,它的意思是“取符号右边的值,把这个值复制给符号左边”。符号右边可以是一个值,也可以是一个表达式(只要它能够生成一个值就行)。但符号的左边必须是一个明确的已定义的变量,即符号左边表示一个物理空间。
好了,以上是对于赋值操作符“=”的解释。在赋值的过程中,出现了大致两种情况:
-
为基本数据类型赋值
对基本数据类型的赋值是简单而且符合我们的期望的。因为基本类型存储了实际的数值,所以在赋值的时候,会直接将自己真实的数值复制到另一个地方。例如,对于基本类型a=b这种赋值情况,b会将自己的实际值复制给a,从此a、b两家互不来往。不管你之后是改变了a的值或者是b的值,对另外一家完全没有影响。 这种情况,称之为值传递。
-
为对象类型赋值
但是在为对象赋值的时候情况却发生了变化。为什么呢? 是因为我们对于对象的操作,实际上是操作了对象的引用。这就好比我们的目标对象是一台电视机A,但是我实际上是通过操作遥控器a来完成了对电视机的操作。此时若有另外一台电视机B没事跑来瞎赋值B=A,这时,就相当于遥控器a同时可以操作两台电视机了。这下可好了,两台电视机成了一条船上的蚂蚱了,不管以后你对遥控器a做什么操作,两台电视机A和B都会同时响应。(什么?你问我电视机B原始的遥控器b跑哪去了?在你赋值的时候就被无情的抛弃了,等待它的将会是GC)
2.示例代码
/** 值传递
* 0.起始状态a=10;b=20
* 1.b赋值给a,此时a=b=20
* 2.单独赋值a=15,b仍旧是20
* 3.单独赋值b=25,a仍旧是15
**/
public class Test{
public static void main(String[] args) {
int a = ;
int b = ;
a = b;
System.out.println("1.a="+a+"***b="+b);
a = ;
System.out.println("2.a="+a+"***b="+b);
b = ;
System.out.println("3.a="+a+"***b="+b);
}
}
输出结果:1.a=20***b=20
2.a=15***b=20
3.a=15***b=25
//对象类
public class T {
int i;
public T(int i) {
this.i = i;
}
}
/** 引用传递
* 1.起始状态t1.i=10;t2.i=20
* 2.t1=t2赋值后,t1.i=t2.i=20
* 3.对t1操作,t1.i=t2.i=50
* 4.对t2操作,t1.i=t2.i=100
**/
public class Test{
public static void main(String[] args) {
T t1 = new T();
T t2 = new T();
System.out.println("1."+t1.i+"***"+t2.i);
t1=t2;
System.out.println("2."+t1.i+"***"+t2.i);
t1.i = ;
System.out.println("3."+t1.i+"***"+t2.i);
t2.i = ;
System.out.println("4."+t1.i+"***"+t2.i);
}
}
输出结果:1.10***20
2.20***20
3.50***50
4.100***100