Java 是传值还是传引用 iamfancy (原作)
关键字 java 传 值 引用
1. 简单类型是按值传递的
Java 方法的参数是简单类型的时候,是按值传递的 (pass by value) 。这一点我们能通过一个简单的
例子来说明:
/* 例 1 */
/**
* @(#) Test.java
* @author fancy
*/
public class Test {
public static void test(boolean test) {
test = ! test;
System.out.println("In test(boolean) : test = " + test);
}
public static void main(String[] args) {
boolean test = true;
System.out.println("Before test(boolean) : test = " + test);
test(test);
System.out.println("After test(boolean) : test = " + test);
}
}
运行结果:
Before test(boolean) : test = true
In test(boolean) : test = false
After test(boolean) : test = true
不难看出,虽然在 test(boolean) 方法中改动了传进来的参数的值,但对这个参数源变量本身并没有
影响,即对 main(String[]) 方法里的 test 变量没有影响。那说明,参数类型是简单类型的时候,是按值传
递的。以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷 贝传进方法函数的,那么在方
法函数里再怎么改动其值,其结果都是只改动了拷贝的值,而不是源值。
2. 什么是引用
Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论
中提到了引用这个东西,为了搞清晰这个问题,我们必须要知道引用是什么。
简单的说,引用其实就像是个对象的名字或别名 (alias) ,一个对象在内存中会请求一块空间来保存数
据,根据对象的大小,他可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在
内存中的数据,而是通过引用去访问。引用也是一种数据类型,我们能把他想象为类似 C 语言中指针的
东西,他指示了对象在内存中的地址 ?? 只不过我们不能够观察到这个地址究竟是什么。
如果我们定义了不止一个引用指向同一个对象,那么这些引用是不相同的,因为引用也是一种数据类
型,需要一定的内存空间来保存。不过他们的值是相同的,都指示同一个对象在内存的中位置。比如
String a = "Hello";
String b = a;
这里, a 和 b 是不同的两个引用,我们使用了两个定义语句来定义他们。但他们的值是相同的,都指