Android系统下Java编程详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.6 值传递和引用传递

3.6.1 知识准备:Java中的值传递

在程序中,经常需要将一个变量的值赋给另一个变量,赋值后,两个变量的值相同,那么,在Java中,它的实现机制是怎样的呢?首先来看一个例子:

源文件:CallByValuePri.java

    /**
    * <DL>
    * <DT><b>功能:</b>
    * <DD>简单类型数据传值调用演示</DD>
    * </DL>
    */
    public class CallByValuePri {
    void half(int n) {
        n = n / 2;
        System.out.println("half方法n=" + n);
    }
    public static void main(String args[]) {
        CallByValuePri cb = new CallByValuePri();
        int m = 10;
        System.out.println("Before the Invocation,m=" + m);
        cb.half(m);
        System.out.println("After the Invocation,m=" + m);
    }
    }

编译并用如下程序执行这个程序:

    java CallByValue

可以得到如下的输出:

    Before the Invocation,m=10
    half方法n=5
    After the Invocation,m=10

可以看到,在调用方法的前后,m的值不变。因为在Java中,传递的是值,这样,只是将m的值传递给了方法half(),而m本身的值并没有发生改变。按值传递的重要特点:传递的是复制的值,也就是说,传递后就互不相关了。

3.6.2 知识准备:Java中的引用传递

引用传递指的是在方法调用时,传递的参数是按引用进行传递,其实传递引用的地址也就是变量所对应的内存空间的地址。示例如下:

源文件:PassByReference.java

    public class PassByReference {
    private void printNumber(AddressBook a){
              a.number = 20;
              System.out.println("printNumber方法中的numner="+a.number);
        }
        public static void main(String[] args) {
        PassByReference p = new PassByReference();
        AddressBook a = new AddressBook();
        a.number         = 10;
        System.        out.println("执行printNumber方法前main方法中的numner="+a.number);
              p.printNumber(a);
              System.out.println("执行printNumber方法后main方法中的numner="+a.number);
              }
        }
        class AddressBook{
        //电话簿中联系人数量
              public int number;
        }

运行结果如下:

    执行printNumber方法前main方法中的numner=10
    printNumber方法中的age=20
    执行printNumber方法后main方法中的age=20

可以看到,当printNumber方法将引用对象a的成员变量number值改变后,方法外的对象a的成员变量number值同样改变。传递的是值的引用,也就是说,传递前和传递后都指向同一个引用(也就是同一个内存空间)。

注意:

在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其他的都是按引用传递。就是直接使用双引号定义字符串方式:String str = "This is Java";