天天看点

Java基础之值传递与引用传递

    • 概念的引出
    • 示例代码

1.概念的引出

    在java的操作符中,有“=”一种操作符,它的意思是“取符号右边的值,把这个值复制给符号左边”。符号右边可以是一个值,也可以是一个表达式(只要它能够生成一个值就行)。但符号的左边必须是一个明确的已定义的变量,即符号左边表示一个物理空间。

    好了,以上是对于赋值操作符“=”的解释。在赋值的过程中,出现了大致两种情况:

  1. 为基本数据类型赋值

    对基本数据类型的赋值是简单而且符合我们的期望的。因为基本类型存储了实际的数值,所以在赋值的时候,会直接将自己真实的数值复制到另一个地方。例如,对于基本类型a=b这种赋值情况,b会将自己的实际值复制给a,从此a、b两家互不来往。不管你之后是改变了a的值或者是b的值,对另外一家完全没有影响。 这种情况,称之为值传递。

  2. 为对象类型赋值

    但是在为对象赋值的时候情况却发生了变化。为什么呢? 是因为我们对于对象的操作,实际上是操作了对象的引用。这就好比我们的目标对象是一台电视机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