【问题标题】:The method clone() from the type Object is not visible - Answers given confuse me [closed]来自 Object 类型的方法 clone() 不可见 - 给出的答案让我感到困惑 [关闭]
【发布时间】: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 和一个&lt;String, Int&gt; 键值对和一个ArrayListStrings。这个问题的重要部分是我试图将integer 值放入我的array temp1。由于 Java 通过引用传递并且我不希望我的 temp 字符串被重置,因此我使用了 .clone() 方法。尽管按照人们所说的去做,但我仍然在这个问题的标题中得到错误。另外,如果有人回答我将temp 重置为"" 时如何确保temp1 不会丢失值,我将不胜感激。

【问题讨论】:

  • “由于 Java 通过引用传递...” 不,它没有。 Java 纯粹是按值传递。当你处理一个对象时,所讨论的值是一个对象引用,但这与传递引用无关,这是一个艺术术语,指的是传递引用将变量(不是对象)转换为方法。特别是关于字符串,由于字符串是不可变的(除非被黑客攻击),因此您无需担心将字符串传递给方法,该方法无法(非恶意地)修改字符串。
  • @TusharSharma 因为String 实现Clonable,因此覆盖clone()方法。
  • @SashaSalauyou 实现接口是不够的,方法还必须是公开的,事实并非如此。
  • @TusharSharma 没有看到您的输入,就无法确认代码正在执行您认为正在执行的操作。我建议您在调试器中单步调试代码,看看它为什么会做一些您不期望的事情。

标签: java clone


【解决方案1】:

Object.clone() 是在 Java 1.0 中添加的,就像一些最早的决定一样,它们今天的做法可能有所不同。

Object 不应该有一个名为 clone 恕我直言的 protected 方法,但 Cloneable 应该有这样一个公共方法。今天,这可以通过使用实用程序类的默认方法来克隆对象来完成,但当时这不是一个选项。

当前实现的缺点是所有对象都有受保护的 clone(),即使是那些不支持它的对象。对于 String 而言,与所有不可变类一样,克隆对象没有意义,因此它不是公共的,但实际上,理想情况下,它根本不应该存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2016-09-04
    • 2013-02-15
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    相关资源
    最近更新 更多