另外来自百度知道的内容:
程序如下:1.packagetest;2.publicclassTest3.{4.staticvoidfun(inta)5.{6.a=10;7.}8.staticvoidfun(String s)9.{10.s="ibm";11.}12.staticvoidfun(Person p)13.{14.p.age=10;15.p.name="ibm";16.}17.publicstaticvoidmain (String []args)18.{19.intnum=5;20.String s="db2";21.Person p=newPerson();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.classPerson33.{34.publicintage;35.publicString 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的值是不会变的。
22/2<12