String如何在Java中作为Object工作

时间:2013-04-30 18:44:49

标签: java string reference

由于我遇到了这个问题,我对于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中的一个Object。为什么不保留变更?

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

String is special,是immutable,与普通对象不同。 Java的String旨在介于基元和类之间。

String按值传递,但不幸的是,String上的每个更改都会生成新值,因此旧引用具有旧值。

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

答案 2 :(得分:0)

msg = "d1 is null!";msg=null是两个不同的String对象。 String在Java中是不可变的。引用按值传递,即传递引用的副本。由于String是不可变对象,因此方法内的赋值会创建一个新的String对象,该引用的副本现在指向该对象。原始引用仍指向null String。您的方法调用与:

相同
Object obj = null; // obj points to nowhere
foo(obj); // passed the reference values to method argument
void foo(Object o)
{
   o = new Object( );  // o points to new Object, but obj still points to nowhere
}

答案 3 :(得分:0)

在Java中,您无法通过分配方法参数将值传回调用代码。你是对的,你可以改变任何参数的内部结构,并在调用代码中看到更改。但是,分配参数与更改内部结构不同。此外,创建了String immutable -once,其内部结构无法更改。

执行使用数组参数的常用技巧:

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]);
}

答案 4 :(得分:0)

这与

的事实有关
  

Java将对象作为值传递的引用传递。

无法更改引用参数以指向其他内容。您可以更改对象状态。

您可以阅读更多here

答案 5 :(得分:0)

if (!checkDateValue(d1, msg)) 

{
    system.println(msg); 
} 

当您致电checkDateValue方法时,方法的引用String msg = null; Date d1 = null; 传递,它是通过值传递的。当方法执行时 msg中的checkDateValue变量将被引用为" d1为空!" 在这里,呼叫中的msg变量保持不变