0

我期待 hello = "hello" 但它打印出 null。我可以知道是什么原因吗?

@Test
public void testGetABC(){
 String hello= null;
 assembleABC(hello);
 System.out.println(hello); // null
}

public static void assembleABC(String hello){
  hello = "hello";
}
4

3 回答 3

3

已编辑

在 Java 中,参数是按值传递的,而不是按引用传递的,实际上您并没有修改hello. 这意味着对象本身的内部状态可能会改变,但您在方法调用中使用的引用(变量)不会改变。

也许知道 C#,您可以在其中通过引用发送参数,但这在 Java 中是不可能的:

@Test
public void testGetABC(){
    String hello= null;
    assembleABC(byRef hello); // NOT really allowed, compilation error
    System.out.println(hello);
}

public static void assembleABC(byRef String hello){ // NOT really allowed, compilation error
    hello = "hello";
}

你可以做些什么来解决你的问题是改变你的代码是这样的:

@Test
public void testGetABC(){
    String hello= null;
    hello = assembleABC();
    System.out.println(hello); // not null anymore
}

public static String assembleABC(){
    return "hello";
}
于 2013-07-26T02:28:08.093 回答
0

在java中,函数的值是通过refrence方法按值传递的。因此,如果您更改保持对象的值,则将反映值的更改。但是,如果您更改了参考本身,那么它们将不会有任何影响。在 java 中,String 是不可变的对象。

检查以下示例以获得更多说明:

public class Test
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        String hello = "hello";
        StringBuffer strBuffer = new StringBuffer("hello");
        changeMe(hello);
        System.out.println(hello);
        changeMe(strBuffer);
        System.out.println(strBuffer);
        changeMe2(strBuffer);
        System.out.println(strBuffer);
        
    }
    
    public static void changeMe(String hello){
        hello = null;
    }
    
    public static void changeMe(StringBuffer strBuffer){
        strBuffer.append("appended");
    }
    
    public static void changeMe2(StringBuffer strBuffer){
        strBuffer  = null;
    }
}

输出:

你好

你好附加

你好附加

于 2013-07-26T02:42:05.410 回答
0

在 Java 中,字符串总是不变的。如果要将引用传递给函数,可以创建自己的(不是最终的)类并将 String 放入其中。

这是一个简单的例子:我已经调用了我自己的类 VariableString :

public class StringTest {

    private class VariableString {
        private String string;

        public String getString() {
            return string;
        }

        public void setString(String string) {
            this.string = string;
        }

        public int length() {
            return this.string.length();
        }
        public String toString() {
            return string;
        }
    }

    public static void assembleABC(VariableString hello) {
        hello.setString("hello");
    }

    public static void main(String[] args) {

        VariableString hello = new StringTest().new VariableString();
        assembleABC(hello);
        System.out.println(hello); // prints hello

    }
}
于 2013-07-26T02:53:04.187 回答