java关于参数传递的思考

首先思考一个问题

public class Test
{
      public static void changeStr(String str)
      {
          str =  "welcome" ;
      }
      public static 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


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


总结:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值