java编程思想阅读笔记 第三章(赋值操作=)

来源:互联网 发布:青岛淘宝美工速成班 编辑:程序博客网 时间:2024/06/10 23:52

Java的赋值操作(=)应该分为两种情况:

1. 针对基本数据类型的赋值操作

2. 针对对象的赋值操作

基本数据类型的赋值很简单。基本数据类型存储了实际的数值,而并非是指向对象的引用,所以在为其赋值的时候,是直接讲一个地方的内容复制到了另一个地方。例如对基本数据类型使用a=b,那么b的内容直接复制给a。若接着又修改了a,而b根本不会受影响。

以交换两个数为例:

public class Swap {public void swap(int a ,int b){int temp=a;a=b;b=temp;}public static void main(String[] args) {int a=5,b=6;System.out.println("a="+a+"\tb="+b);Swap s=new Swap();s.swap(a, b);}}

输出结果为:a=5 b=6
我们可以看到,对基本数据类型的赋值操作并不会影响到原来的值。

但是当为对象赋值时,情况发生了变化。对一个对象进行操作时,我们真正操作的是对象的引用。所以如果将一个对象赋值给另一个对象,实际上是将引用从一个地方复制到另一个地方。这意味着如果对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。举个例子来看:

class Tank{int level;}public class Assignment {public static void main(String[] args) {Tank t1=new Tank();Tank t2=new Tank();t1.level=1;t2.level=2;System.out.println("t1.level:"+t1.level+"\tt2.level:"+t2.level);t1=t2;System.out.println("t1.level:"+t1.level+"\tt2.level:"+t2.level);t1.level=25;System.out.println("t1.level:"+t1.level+"\tt2.level:"+t2.level);}}
输出结果为:
t1.level:1t2.level:2t1.level:2t2.level:2t1.level:25t2.level:25
方法调用的过程中也存在这样的别名问题:
class Letter{char c;}public class PassObject {static void f(Letter f){f.c='z';}public static void main(String[] args) {Letter x=new Letter();x.c='a';System.out.println("x.c:"+x.c);f(x);System.out.println("x.c:"+x.c);}}
输出结果为:
x.c:ax.c:z
我们可以看到,实际上函数传递了一个引用,所以f()实际上改变的是该函数之外的对象。
                                             
0 0