Java参数传递是通过值传递,也就是拷贝传递。Java有两种变量,一种是值变量,一种是引用变量。
先看看值变量情况:
int x = 0x111;
void go(int z)
{
z=0;
}
go(x);
println("x=", x);
打印结果x=7 (0x111). x被传入方法go后,只是把它的值拷贝后赋给了z变量。z变量的任何变化,不会改变原来x的值。
Java里面没有c语言一样的地址指针,这也是Java安全的基础,更是Java垃圾回收或者说内存自动管理的关键。
在看看引用变量作为参数被传入函数的情况:
引用变量可以理解为一个指针,它指向在堆上的对象实例。当引用变量被作为参数传入函数,实际上是传入了堆上对象实例的地址,对于这个对象所有操作均发生在堆上。所有结果是参数(对象的引用)未发生变化,但是参数(对象的引用)指向的对象实例,可能会被改变。
- public class Test{
- String str = new String("good");
- char[] ch = {'a','b','c'};
- int i = 10;
- String[] ss1 = {"aaa"};
- public void change(String str,char[] ch,int i, String[] s){
- i++;
- str = "test ok";
- ch[0] = 'g';
- s[0] = "bbb";
- }
- public static void main(String[] args){
- Test tt = new Test();
- tt.change(tt.str,tt.ch,tt.i);
- System.out.println(tt.i);
- System.out.print(tt.str);
- System.out.println(tt.ch);
- System.out.println(tt.s);
- }
- } //以上程序来源于网络
10 // 参数是值变量,通过值传递后被拷贝了一份,所以原来的值不会被修改
good // String是一个对象,但是它比较特殊,详细解释见本文最后一段话。来自于http://blog.youkuaiyun.com/sujiacheng_123/article/details/53392830
gcb // 参数是数组,数组名其实是一个引用,引用被拷贝后还是指向同样的数据对象,所以对象的值被改变
bbb // 参数是String的数组,原因同上
因为在Java里,String是对象类型,作为参数肯定是引用传递。之所以有值传递的效果,是因为Stirng内部实现时,是用char[] 来存储字符串的,所以String相当于char[]的包装类,那Java中,包装类的一个特质就是值操作时体现对应的基本类型的特质。