0

据我了解,java中的对象是通过引用传递的,或者更准确地说,对对象的引用是通过值传递的。那么,如果我声明一个字符串并将其传递给我更改字符串值的函数,为什么原始字符串不会更改?例如:

class Thing 
{

    static void func(String x){ x = "new"; }

    public static void main(String [] args)
    {
        String y = "old";
        func(y);
        System.out.print(y);
    }
}

为什么 y 的值仍然“旧”?

编辑:为什么下面将 Thing something 的属性 x 设置为 90?

class Thing { int x = 0; 

static void func(Thing t){ t.x = 90; }

public static void main(String [] args){
    Thing something = null;
    something = new Thing();
    func(something);
    System.out.print(something.x);
}
}
4

5 回答 5

2

首先,Java 中的所有内容都是按值传递的。甚至引用也是按值传递的。

您已经创建了一个新的string文字并且没有在方法中返回它func()

您正在修改传递的参数而不是原始参数string,因此您看不到更改。

你可能需要这个,

public static void main(String [] args)
    {
        String y = "old";
        y= func(y);
        System.out.print(y);
    }

 static String func(String x){ 
  x = "new";  
  return x
 } 

编辑评论:

不,他们都不相同。两种方式之间存在很大差异String,尤其是在内存方面。

编辑2:

在第一种情况下,您在方法中创建了一个新的字符串文字func ,但在这里您正在修改引用。

当您完成时,您的疑问会澄清

  static void func(Thing t){
     t = new Thing(); //as like previous example
     t.x = 90;       // points to new one. Not the original.

    }

现在检查结果。

于 2013-10-19T06:03:35.670 回答
0

那么,如果我声明一个字符串并将其传递给我更改字符串值的函数,为什么原始字符串不会更改?

要知道的重要一点是,您不能声明其值为字符串的变量——字符串(它们是对象)在 Java 中不是值。y是一个引用(指向对象的指针)。Java 中唯一的类型是原始类型和引用类型。该类型String引用类型

因此,您正在传递y一个引用(指向对象的指针)。在函数内部,x同样是一个引用(指向对象的指针)。更改引用的值(例如将 ( =) 分配给x)永远不会对它可能指向的对象产生任何影响。

.运算符允许您访问引用指向的对象的字段。分配给.访问结果会更改引用指向的对象,而不是引用本身。这些是非常不同的事情。

于 2013-10-20T22:44:03.990 回答
0

如此处所述:

Java 通过值而不是通过引用传递所有内容——请确保您记住这一点。当我们说一切时,我们指的是一切——对象、数组(Java 中的对象)、原始类型(如整数和浮点数)等——这些都是 Java 中的值传递。按值传递和按引用传递有什么区别?将参数(甚至多个参数)传递给方法时,Java 将在原始变量中创建一个或多个值的副本,并将其作为参数传递给方法——这就是为什么它被称为按值传递. 通过值传递的关键是该方法不会接收正在传递的实际变量——而只是存储在变量中的值的副本。

于 2013-10-19T06:11:09.820 回答
0

它与不变性无关。这完全是关于如何传递参数和变量的范围。

这是你的函数调用

String y = "old"; // The reference y pointing to the string object "old": y ---> "old"
func(y);  

当你进入被调用的函数时

static void func(String x){  // x = y which means x now points to "old": x ---> "old"
    x = "new"; // x ---> "new": now the local variable x is pointing to a different object. y still points to "old".
} //Scope of x ends here

当我们打印它

System.out.println(y);

y 仍然指向“旧”。一个新的 String 对象被分配给方法 func 的本地 x。因此,它仍然打印“旧”。

于 2013-10-19T06:17:16.190 回答
-1

在 Java 中对象和字符串的处理方式不同,字符串在 JAVA 中保持不可变。

在你的例子中更清楚:

让我们假设,字符串 y 指向内存位置 2000,字符串 x 指向内存位置 2001,所以你得到相同的旧值。

如果是对象,请参考我的示例:

http://javaambition.blogspot.kr/2013/08/java-pass-by-value.html

于 2013-10-19T06:15:05.550 回答