java - 将字符串对象作为参数传递 Java

标签 java

class prog {

      static String display(String s)
      {
         s = "this is a test";
         return s;
      }

   public static void main(String...args) {

     prog p = new prog();
     String s1 = "another";
     System.out.println(display(s1)); //Line 1
     System.out.println(s1);
   }
}

一个新手问题。

有人可以解释为什么 s1 没有更新为“这是一个测试”吗?

我认为在 Java 中,对象参数作为引用传递,如果是这种情况,那么我在第 1 行中将 String s1 对象作为引用传递。

并且 s1 应该通过 display() 方法设置为“这是一个测试”。对吧?

最佳答案

Java 始终是按值传递。对于引用类型,它传递引用值的副本。

在你的

static String display(String s)
{
    s = "this is a test";
    return s;    
}

String s 引用被重新分配,它的值被改变。被调用的代码不会看到此更改,因为该值是一个副本。

对于 String,很难显示行为,因为它们是不可变的,但举个例子

public class Foo {
    int foo;
}

public static void main(String[] args) {
    Foo f = new Foo();
    f.foo = 3;
    doFoo(f);
    System.out.println(f.foo); // prints 19
}

public static void doFoo(Foo some) {
    some.foo = 19;
}

但是,如果你有

public static void doFoo(Foo some) {
    some = new Foo();
    some.foo = 19;
}

原始文件仍会显示 3,因为您不是通过传递的引用访问对象,而是通过 new 引用访问它。


当然,您始终可以返回新引用并将其分配给某个变量,甚至可以是您传递给方法的同一个变量。

关于java - 将字符串对象作为参数传递 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662253/

相关文章:

java - j2ee应用程序中涉及循环引用和数组的内存泄漏

java - 从 Calendar 到 GregorianCalendar 无需转换

java - 在Java中打印三角形

java - Apache HTTPClient 4.x 与 HttpUrlConnection - 在 Android 上哪个更快?

java - 检索 JList 项的数组数据

java - 设置列标题的最大高度 - NatTable

java - JTextField 在 GridBagLayout 中未对齐

java - Xpath 无法找到文本

java - JPA Criteria API 中的订单自定义 SQL

java - 我如何实现一个具有多行按钮的 Java GUI,这些按钮彼此等距