java关于参数传递的思考

来源:互联网 发布:梦洁床垫怎么样知乎 编辑:程序博客网 时间:2024/05/19 15:18

首先思考一个问题

publicclass Test
{
     publicstatic void changeStr(String str)
     {
         str = "welcome";
     }
     publicstatic void main(String[] args)
     {
         String str = "1234";
         changeStr(str);
         System.out.println(str);
     }
}
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


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


总结:

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

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

0 0
原创粉丝点击