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)