gpt4 book ai didi

java - 将字符串传递给函数

转载 作者:行者123 更新时间:2023-12-02 11:02:06 25 4
gpt4 key购买 nike

我想问一个非常简单的问题。我只是将一个 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";
}

}

谢谢。

编辑:

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";

}

}

如果是这种情况,那么为什么如果我将它传递到包装对象中就可以工作?包装对象它不是通过引用吗?

PS:为什么会这样?字符串是一个对象。为什么我需要另一个包装对象来更改对象!如果我想通过引用传递某些内容怎么办?这可能吗?

最佳答案

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

 String origStr = "Some String"

// origStr -> "Some String "

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

 //origStr -> "Some String " <- passedStr

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

 //origStr -> "Some String "
//passedStr -> "Other String"

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

当您从函数返回时,原始字符串引用仍然指向“Some String”

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

假设我有 StringWrapper,它是一个包含字符串的类。

到java看起来像这样

origStr -> strWrpA -> "Some String"

当您将其传递给函数时,会发生以下情况,就像上面一样

origStrWrp -> strWrpA -> "Some String"
passedStrWrp --/^

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

                        "Some String "
origStrWrp -> strWrpA -> "I got Changed!"
passedStrWrp --/^

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

//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.
}

关于java - 将字符串传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9183703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com