您的位置:首页 > 编程语言 > Java开发

java关于参数传递的思考

2016-05-02 12:15 232 查看
首先思考一个问题

Please write the output result 。

1234

welcome



不确定
首先,Java方法调用中,只存在值传递调用。

实参str是引用变量,指向字符串常量“1234”,由于java方法调用是值传递,所以形参str得到的是实参str的一个拷贝。此时形参str和实参str均指向字符串"1234"。

然后,在changeStr方法中,形参str指向了一个新的字符串"welcom",而后方法结束,形参str被销毁。而实参str仍然指向字符串"1234"。

再看下面的例子:

public class TestDemo

{

     public static void changeStr(Demo d)

     {

    System.out.println("我是形参"+d);

    d=new Demo();

    System.out.println("我是形参"+d);

     }

     public static void main(String[] args)

     {

    Demo d=new Demo();

    System.out.println("我是实参"+d);

    changeStr(d);

    System.out.println("我是实参"+d);

     }

}

打印结果为

我是实参com.chris.test2.Demo@139a55

我是形参com.chris.test2.Demo@139a55

我是形参com.chris.test2.Demo@1db9742

我是实参com.chris.test2.Demo@139a55

得到的结果与第一个例子一样

实参d是引用变量,指向对象Demo@139a55,由于java方法调用是值传递,所以形参d得到的是实参d的一个拷贝。此时形参d和实参d均指向对象Demo@139a55

然后,在changeStr方法中,形参d指向了一个新的对象Demo@1db9742,而后方法结束,形参d被销毁。而实参str仍然指向对象Demo@139a55

那么在什么情况下才能通过改变形参从而改变实参呢?

答案是:如果形参是普通类,则可以通过改变形参中的属性变量,来改变实参的属性变量,因为都指向相同的对象

 
    如果形参是数组或者,集合,则可改变数组或集合中元素的内容,来改变实参,因为都指向相同的对象

但是如果让形参指向了另一个类,则此时形参和实参就指向了不同的对象,他们就没有关系了。

(1)通过改变形参中的属性变量,来改变实参的属性变量

public class TestDemo

{
public static int i=0;

     public static void changeStr(TestDemo d)

     {

    System.out.println("我是形参"+d.i);

    d.i=2;

    System.out.println("我是形参"+d.i);

     }

     public static void main(String[] args)

     {

    TestDemo d=new TestDemo();

    System.out.println("我是实参"+d.i);

    changeStr(d);

    System.out.println("我是实参"+d.i);

     }

}

打印结果为

我是实参0

我是形参0

我是形参2

我是实参2

这样就能通过改变形参中的属性变量,来改变实参的属性变量了。

(2)通过改变数组或集合中元素的内容,来改变实参

public class TestDemo

{

     public static void changeStr(List<String> list)

     {

    System.out.println("我是形参"+list.size());

    list.add(0, "hellokit");

    System.out.println("我是形参"+list.size());

     }

     public static void main(String[] args)

     {

         List<String> list = new ArrayList();

         System.out.println("我是实参"+list.size());

         changeStr(list);

         System.out.println("我是实参"+list.size());

     }

}

打印结果:

我是实参0

我是形参0

我是形参1

我是实参1

这样就能通过改变数组或集合中元素的内容,来改变实参了。

总结:

如果让形参指向了另一个类,则此时形参和实参就指向了不同的对象,他们就没有关系了。

如果形参是普通类,则可以通过改变形参中的属性变量,来改变实参的属性变量,因为都指向相同的对象

如果形参是数组或者,集合,则可改变数组或集合中元素的内容,来改变实参,因为都指向相同的对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: