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 变量没有影响。那说明,参数类型是简单 类型的时候,是按值传递的。以参数形式传递简单类型的变量时,实际上是将参数的值作了一个 拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的值,而不 是源值。
C 语言中有一种数据类型叫做指针,于是将一个数据作为参数传递给某个函数的时候,就有 两种方式:传值,或是传指针,它们的区别,可以用一个简单的例子说明:
/* 例 5 */ /** * @(#) test.c * @author fancy */ void SwapValue(int a, int b) { int t = a; a = b; b = t; } void SwapPointer(int * a, int * b) { int t = * a; * a = * b; * b = t; } void main() { int a = 0, b = 1; printf("1 : a = %d, b = %d/n", a, b); SwapValue(a, b); printf("2 : a = %d, b = %d/n", a, b); SwapPointer(&a, &b); printf("3 : a = %d, b = %d/n", a, b); } 运行结果:
1 : a = 0, b = 1 2 : a = 0, b = 1 3 : a = 1, b = 0 大家可以明显的看到,按指针传递参数可以方便的修改通过参数传递进来的值,而按值传递 就不行。
当 Java 成长起来的时候,许多的 C 程序员开始转向学习 Java,他们发现,使用类似 SwapValue 的方法仍然不能改变通过参数传递进来的简单数据类型的值,但是假如是一个对象, 则可能将其成员随意更改。于是他们觉得这很像是 C 语言中传值/传指针的问题。但是 Java 中 没有指针,那么这个问题就演变成了传值/传引用的问题。可惜将这个问题放在 Java 中进行讨论 并不恰当。