上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";