JAVA的函数传递问题 wait online。。。

来源:百度知道 编辑:UC知道 时间:2024/06/28 20:00:15
程序如下:
package test;
public class Test
{
static void fun(int a)
{
a=10;
}
static void fun(String s)
{
s="ibm";
}
static void fun(Person p)
{
p.age=10;
p.name="ibm";
}
public static void main (String []args)
{
int num=5;
String s="db2";
Person p=new Person();
p.age=5;
p.name="db2";
fun(num);
fun(s);
fun(p);
System.out.println(num);
System.out.println(s);
System.out.println(p.age+" "+p.name);
}
}
class Person
{
public int age;
public String name;
}
输出结果是:
5
db2
10 ibm
----------------------------------------------------------------------------------
问题:请问什么时候传参数是按值传递?什么时候是按引用or地址传递?为什么?
谢谢,我刚学java,很多不明白的地方,希望大家多多指教。
问:yangzhen86

上面的回答是错的,记住,在java中,方法是按值传递的,根本就不是按地址传递!

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的值是不会变的。

如果你还是不明白的话,看看这片文章
JAVA的函数传递问题 wait online。。。 java中不同类函数间的参数传递问题? 帮忙看一下函数的传递问题? java参数传递的简单问题 关于一个java参数传递的问题 java中对象的传递问题 函数的参数传递 JAVA的参数传递 java的main函数问题 java时间函数的问题