将字符串传递给函数

gla*_*kou 2 java

我想问一个非常简单的问题.我只是将一个String对象传递给一个函数,但结果很奇怪.我认为因为我传递一个对象(通过引用),结果应该是"Here"而不是"Hello".为什么会这样?

public class MainStr
{

/**
 * @param args
 */
public static void main(String[] args)
{
    String str = "Hello!";
    System.out.println(str);
    changeString(str);
    System.out.println(str);


}

static void changeString(String str)
{
    str=" HERE";
}

}
Run Code Online (Sandbox Code Playgroud)

谢谢.

编辑:

public class MainStr
{

String str;
/**
 * @param args
 */
public static void main(String[] args)
{
    MainStr ms = new MainStr();
    ms.str = "Hello!";
    System.out.println(ms.str);
    changeString(ms);
    System.out.println(ms.str);


}

static void changeString(MainStr ms)
{
    ms.str=" HERE";

}

}
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,那么为什么我在包装器对象中传递它是有效的?包装器对象不是通过引用?

PS:为什么这样做?String是一个对象.为什么我需要另一个包装器Object来更改OBJECT!如果我想通过引用传递内容怎么办?那可能吗?

Rus*_*ssS 7

Java通过值传递对象引用,这意味着当您调用函数时会发生以下情况.

 String origStr = "Some String"

 // origStr -> "Some String "
Run Code Online (Sandbox Code Playgroud)

当对象传递给值时,它看起来像这样

 //origStr -> "Some String " <- passedStr
Run Code Online (Sandbox Code Playgroud)

然后在函数中重置passStr指向的内容

 //origStr -> "Some String "
 //passedStr -> "Other String"
Run Code Online (Sandbox Code Playgroud)

原始字符串仍然引用"Some String",但它的副本现在引用"Other String"

从函数返回时,原始字符串引用仍指向"Some String"

//编辑:为什么你可以修改另一个对象引用的对象?

可以说我有StringWrapper,它是一个包含字符串的类.

对于看起来像这样的java

origStr -> strWrpA -> "Some String"
Run Code Online (Sandbox Code Playgroud)

当您将其传递给函数时,会发生以下情况

origStrWrp -> strWrpA -> "Some String"
passedStrWrp --/^
Run Code Online (Sandbox Code Playgroud)

注意两个变量如何指向内存中的strWrpA.现在,如果我决定修改strWrpA.myString,Java将跟随指向包装器中实际字符串的指针.指向strWrpA的指针将保持不变.这意味着我可以更改对象的内容,即使我通过原始引用的副本访问它.

                        "Some String "
origStrWrp -> strWrpA -> "I got Changed!"
passedStrWrp --/^
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你会遇到与没有包装器时相同的问题

//Does Nothing
function (origStrWrp)
{
origStrWrp=new StringWrapper("Other String") // This only reassigns the copy of the reference and would give you the same problem
}
//Changes internal object
function (origStrWrp)
{
origStrWrp.myString = "Other String" // This doesn't change the reference, it changes the object that it refers to.
}
Run Code Online (Sandbox Code Playgroud)