由于我遇到了这个问题,我对于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。为什么不保留变更?
答案 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)
答案 5 :(得分:0)
if (!checkDateValue(d1, msg))
{
system.println(msg);
}
当您致电checkDateValue
方法时,方法的引用String msg = null;
Date d1 = null;
传递,它是通过值传递的。当方法执行时
msg
中的checkDateValue
变量将被引用为" d1为空!"
在这里,呼叫中的msg
变量保持不变