String如何在Java中作为Object使用

由于遇到这个问题,我对Object在Java中的工作方式感到困惑。

比方说,我有一个名为checkDateValue的函数(代码如下所示)

private boolean checkDateValue(Date d1, String msg) {
    if (d1 == null) {
        msg = "d1 is null!";
        return false;
    }
    return true;
}

这里是我称之为这个功能的地方:

String msg = null;
Date d1 = null;
if (!checkDateValue(d1, msg)) {
    system.println(msg); //msg is still null..... 
                         //what I need is the message generated in the function
}

据我所知,如果我把一个自定义的对象(例如

myObj { private String msg;} 

)转换成一个函数,并且我们改变函数内的msg的值,当我们离开函数时,msg的改变被保留。 不过,我认为String也被认为是java中的一个对象。 为什么变化不被保留?


字符串是特殊的,是不可变的,与普通对象不同。 Java的String被设计为处于基元和类之间。

字符串是按值传递的,但不幸的是,String上的每个更改都会创建新值,因此您的旧引用具有旧值。

我认为这是很好的解释:https://stackoverflow.com/a/1270782/516167


Java没有"out"函数参数; 他们是参考文献的副本。 即使您在函数中更改了msg ,它也不会影响调用者的变量。


在Java中,您不能通过分配给方法参数将值传回给调用代码。 你是对的,你可以改变任何参数的内部结构,这种改变将在调用代码中看到。 但是,分配给参数与改变内部结构不同。 而且,一个String是不可变的 - 一旦创建,它的内部结构就不能改变。

一个常见的技巧就是要使用数组参数:

private boolean checkDateValue(Date d1, String[] msg) {
    if (d1 == null) {
        msg[0] = "d1 is null!";
        return false;
    }
    return true;
}

然后像这样调用它:

String[] msg = new String[1];
Date d1 = null;
if (!checkDateValue(d1, msg)) {
    system.println(msg[0]);
}
链接地址: http://www.djcxy.com/p/20891.html

上一篇: How does String works as Object in Java

下一篇: Compiler: How to implement Reference Counting (in a simple VM)