2016-04-09 57 views
0
class OtherObject { 
    String innerString; 
    OtherObject(String x) {innerString = x;} 
} 

class Playground { 
    public static void mutate(OtherObject toMutate) { 
     toMutate.innerString = toMutate.innerString.substring(toMutate.innerString.length()/2); 
    } 

    public static void mutate(String toMutate) { 
     toMutate = toMutate.substring(toMutate.length()/2); 
    } 

    public static void main(String[] args) { 
     String helloWorld = new String("Hello, World!"); 
     OtherObject helloWorld2 = new OtherObject("Hello, World!"); 
     mutate(helloWorld); 
     mutate(helloWorld2); 

     System.out.println(helloWorld); 
     System.out.println(helloWorld2.innerString); 
    } 
} 

在本例中,我已通过方法mutate设置两个对象,并且只有对象之一改变,如图中的输出:为什么在这个例子中没有改变String helloWorld?

Hello, World! 
World! 

Process finished with exit code 0 

这混淆我因为如果我记错:

  • 对象,当传入的方法是传递引用,因此即使没有返回,对象本身可以改变
  • 这是我可以传递ArrayList到上午ethod并操作它,而不必返回相同的ArrayList并将其分配给main中的前一个ArrayList。
  • 字符串是一个对象。

为什么String helloWorld没有改变?

+0

字符串是不可变的 - 它们不能改变。 – chrylis

回答

2

你似乎是问到这个问题:

public static void mutate(String toMutate) { 
    toMutate = toMutate.substring(toMutate.length()/2); 
} 

toMutate变量是包含一个字符串对象的引用的局部变量。分配给它只有改变局部变量。它不会更改引用来自的调用方法中的变量。

技术答案是Java参数传递是“按值传递”而不是“传递参考”。当你传递一个字符串时,你通过值传递字符串引用。您不传递对调用方中保存字符串引用的变量的引用。你不能用Java来做到这一点。

简而言之,在Java中实现void mutate(String)是不可能的,它具有您似乎需要的语义。方法签名需要不同,语义和用法会有所不同。


对象,当传递到方法传递引用,因此,即使不返回,对象本身可被改变。

有你的错误。一个对象可以被改变,只要它被设计为被改变。一个String对象是不可变的。它是专门设计的,所以你不能改变它。

如果您想要Java中的“string like”对象可以更改,可以使用StringBuilderStringBuffer对象。 (请参阅javadocs以了解详细信息以及它们之间的差异。)

-1

因为字符串在Java中是不可变的。也就是说,一旦创建,相同的String对象就不能被突变。在内部,Java使用java.lang.StringBuffer来更改字符串,而不是对String对象本身进行更改。

这是因为,在Java中创建的字符串本身无法更改。在mutate(String)方法中创建单独的String对象。你的原始字符串仍然存在。

0

您需要仔细考虑这些示例中的更改内容。

当你写

toMutate.innerString = toMutate.innerString.substring(toMutate.innerString.length()/2) 

你改变的OtherObject实例的领域innerString。这就是变异对象的意思;改变它的领域。

在另一方面,当你写

toMutate = toMutate.substring(toMutate.length()/2); 

你不改变任何对象的字段。你正在做的是重新分配一个变量。因为Java总是按值传递,即使它传递的是对象引用,这条线也没有任何影响。

相关问题