String字符串问题

public class C {
  public static void main(String[] args) {
      String a = "abc";
      test(a);
     System.out.println(a);
}

  public static void test(String s){
       s="ddddd";
  }
    
}

我知道String字符串一旦创建就不可变,但是上面这段代码,调用test方法a的句柄应该是变了啊,为什么输出还是abc

阅读 2.3k
4 个回答

JAVA 中形参传递的是值不是引用,所以不能修改原来引用的值。
有一个篇文章讲的这个,你可以参照下。
https://dailycast.github.io/J...

public class C {
      public static void main(String[] args) {
          String a = "abc";
          test(a);//a会不会改变取决于在test方法里面是否修改了a的内容
          //String内部使用private final char value[];存储值
         System.out.println(a);//输出1bc
    }

      public static void test(String s){
          
           //s="ddddd";//a和一开始都指向常量池的abc,执行s="ddddd"并没有改变char value[]的内容,而是指向常量池的ddddd,所以a还是abc
          //想改变char数组的内容可以使用反射
          try {
            Class clazz=s.getClass();
            Field c=clazz.getDeclaredField("value");
            c.setAccessible(true);
            char[] cc=(char[]) c.get(s);
            cc[0]='1';
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
      }
        
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题