【发布时间】:2016-07-06 09:36:57
【问题描述】:
我知道这个问题以前有人问过,但似乎每个人都给出了相同的答案,把这个:
public Object clone(){
try{
return super.clone();
}catch(Exception e){
return null;
}
}
进入班级并将implements Cloneable 添加到班级标签,它应该可以工作。但在我尝试的情况下它不起作用。我的代码是:
while (it.hasNext())
{
Map.Entry pair = (Map.Entry)it.next();
for(int i = 0; i < listOfString[k].size(); i++)
{
String vals = listOfString[k].get(i);
if((vals).endsWith(pair.getValue().toString()))
{
temp = vals.substring(0,29);
Object tempCopy = "";
tempCopy= temp.clone();
temp1[j][i] = Integer.parseInt(tempCopy.toString(),2);
System.out.println(temp1[j][i]); // gives value if I use temp directly - without cloning
}
temp ="";
System.out.println(temp1[j][i]); //gives 0 if i use temp directly - without cloning
}
j++;
it.remove();
}
基本上,我有一个map 和一个<String, Int> 键值对和一个ArrayList 的Strings。这个问题的重要部分是我试图将integer 值放入我的array temp1。由于 Java 通过引用传递并且我不希望我的 temp 字符串被重置,因此我使用了 .clone() 方法。尽管按照人们所说的去做,但我仍然在这个问题的标题中得到错误。另外,如果有人回答我将temp 重置为"" 时如何确保temp1 不会丢失值,我将不胜感激。
【问题讨论】:
-
“由于 Java 通过引用传递...” 不,它没有。 Java 纯粹是按值传递。当你处理一个对象时,所讨论的值是一个对象引用,但这与传递引用无关,这是一个艺术术语,指的是传递引用将变量(不是对象)转换为方法。特别是关于字符串,由于字符串是不可变的(除非被黑客攻击),因此您无需担心将字符串传递给方法,该方法无法(非恶意地)修改字符串。
-
@TusharSharma 因为
String不实现Clonable,因此不覆盖clone()方法。 -
@SashaSalauyou 实现接口是不够的,方法还必须是公开的,事实并非如此。
-
@TusharSharma 没有看到您的输入,就无法确认代码正在执行您认为正在执行的操作。我建议您在调试器中单步调试代码,看看它为什么会做一些您不期望的事情。