可口可乐最新产品:总结Java函数传值和传引用的问题

来源:百度文库 编辑:偶看新闻 时间:2024/05/04 18:48:12
发布时间: 2010-4-13 10:35    作者: 未知    来源: 51Testing软件测试网采编
字体:  小  中  大  | 上一篇 下一篇 | 打印  | 我要投稿
另外来自百度知道的内容:
程序如下:
1.           package test;  2.           public class Test  3.           {  4.           static void fun(int a)  5.               {  6.                  a=10;  7.               }  8.               static void fun(String s)  9.               {  10.             s="ibm";  11.           }  12.           static void fun(Person p)  13.           {  14.             p.age=10;  15.             p.name="ibm";  16.           }  17.        public static void main (String []args)  18.        {  19.          int num=5;  20.          String s="db2";  21.          Person p=new Person();  22.          p.age=5;  23.          p.name="db2";  24.          fun(num);  25.          fun(s);  26.          fun(p);  27.          System.out.println(num);  28.          System.out.println(s);  29.          System.out.println(p.age+"  "+p.name);  30.       }  31.       }  32.       class Person  33.       {  34.        public int age;  35.        public String name;  36.       }    输出结果是:
5
db2
10  ibm
解释:
String str = "db2";
str是一个对象,传到这个方法里面为什么不能改变
static void fun(String s)
{
s="ibm";
}
原因在于java中是传值,方法中的s是你传递进来的str的副本,s和str指向同一个对象,但是这并不是代表是按地址传递的,你让s = "ibm";你要知道"ibm"也是一个String对象,你是让一个副本指向了一个新的对象,所以,由于是值传递,不是地址传递,所以str并不会改变自己的值,因为他还是指向"db2",并没有指向"ibm";地址是没有变的。
至于person,你传进来的也是一个副本,但这个副本修改的是同一个地址中person对象的参数,所以当方法执行完,person中的参数会发生变化。
如果你还认为java可以按地址传递的话,你可以把
static void fun(Person p)
{
p.age=10;
p.name="ibm";
}
这个方法稍加变化,改为
static void fun(Person p) {
p = new Person();
p.age = 111111;
p.name = "2222222";
}
你在把person的age和name打出来看看,什么变化都没有,原因就是p指向了一个新的person对象,是一个新的地址,java不是按照地址传递,所以person的值是不会变的。