qq_38387408
GO_BY_GO_BY_GO
采纳率50%
2017-04-19 09:21 阅读 1.8k
已采纳

刚入门java新手咨询引用数据类型作为实参传递后方法内修改是否会对原数据进行修改

public class StringTest {
public static void main(String[] args) {
String a="aaa";
System.out.println(a);
change(a);
System.out.println("修改后的a:"+a);

}

public static void change(String a) {
    String b="bbb";
    a=b;
    System.out.println("change方法中的a:"+a);
}

}
String为引用数据类型,传递过去的是地址,地址在方法内进行了重新修改,出来后指向不应该是指向了bbb吗?怎么还是aaa?求助图片说明图片

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

11条回答 默认 最新

  • 已采纳
    hongyu83916 hongyu83916 2017-04-19 13:18

    自己也是初学者,见解不深刻,回答有点武断。不好意思,一起学习,我今天也遇到这个问题。回答之后,感觉自己的结论有问题。
    借你宝地,请高手问答:
    public class QueueTest {
    public static void main(String[] args) {
    String[] a=new String[1];
    a[0]="aaa";
    System.out.println(Arrays.toString(a));
    change(a);
    System.out.println("main中:"+Arrays.toString(a));
    }
    public static void change(String[] a){
    String[] b={"bbb"};
    a[0]=b[0];
    a=b;
    System.out.println("change中:"+Arrays.toString(a));
    }
    }
    //===变了==
    [aaa]
    change中:[bbb]
    main中:[bbb]
    //===============================
    /*public class QueueTest {
    public static void main(String[] args) {
    String[] a=new String[1];
    a[0]="aaa";
    System.out.println(Arrays.toString(a));
    change(a);
    System.out.println("main中:"+Arrays.toString(a));
    }
    public static void change(String[] a){
    String[] b={"bbb"};
    a=b;
    System.out.println("change中:"+Arrays.toString(a));
    }
    }
    //===没变
    [aaa]
    change中:[bbb]
    main中:[aaa]
    */

    点赞 1 评论 复制链接分享
  • qq_34599254 MissNull 2017-04-19 09:41

    a传的是地址 这个时候a指向的是"aaa"的地址
    change方法里面的这个a并不是main方法里面的a,虽然它们都指向"aaa",但是不是同一个变量
    所以,比你让a=b,只是让change里面的a指向"bbb",此时main里面的a指向没变!

    点赞 1 评论 复制链接分享
  • u013835855 山洼之神 2017-04-19 10:31

    另外补充一点,其实string使用过程中只要进行了操作,那么就会生成new出新的string(隐式的),所以string的操作跟普通的值传递给人的感觉是一样的。

    点赞 1 评论 复制链接分享
  • Esdeath_yzh Esdeath_yzh 2017-04-19 10:37

    可以这么理解:传递引用参数的时候传递的是一个地址的值,实参a的地址被赋给了形参a,在change里面改变形参的地址并不会影响到实参。

    点赞 1 评论 复制链接分享
  • hongyu83916 hongyu83916 2017-04-19 12:35

    public class QueueTest {
    public static void main(String[] args) {
    String a="aaa";//new String("aaa");
    System.out.println(a);
    change(a);
    System.out.println("main中:"+a);
    }
    public static void change(String a){
    String b="bbb";
    b=a;//此处
    System.out.println("change中:"+a);
    }
    }
    //JAVA 函数参数是值传递。 再说,你上面的初始化方式String a="aaa";
    “aaa”在常量池里面,程序加载之后,只要JVM不挂掉,谁都改不了,连GC都回收不掉。

    点赞 1 评论 复制链接分享
  • hongyu83916 hongyu83916 2017-04-20 01:54

    图片说明

    点赞 1 评论 复制链接分享
  • xuanzhangran 转角人生 2017-04-19 09:29

    这是作用域的问题,main中a作用域在main里,所以不会改变。而你调用方法的时候把a带出来了,执行了调用的方法,所以change中的a会发生改变。记住:作用域。。

    点赞 评论 复制链接分享
  • u013835855 山洼之神 2017-04-19 10:22

    String不是传指针,如果是List就是传指针

    点赞 评论 复制链接分享
  • u013835855 山洼之神 2017-04-19 10:24

    哦,错了,string是传递引用这里外面的a是实参,change中的a为形参,形参为临时的指向外面的a,但是这里你又将b赋值给a,这个临时的形参又重新指向了b,与外部的a就没有任何关系了。

    点赞 评论 复制链接分享
  • qq_21995733 宝宝很6 2017-04-20 01:16

    想要改变的话将a变为全局变量写在main方法上面就可以了

    点赞 评论 复制链接分享
  • qq_38387408 GO_BY_GO_BY_GO 2017-04-20 05:28

    问了下老师,老师说是在change方法里出了个临时的String变量,并没有影响主方法里的String a

    点赞 评论 复制链接分享

相关推荐