【问题标题】:Clone() in javajava中的克隆()
【发布时间】:2012-02-06 17:09:15
【问题描述】:
import java.util.*;
import java.lang.*;

public class Test{
    public static void main(String[] argv){
        String s1="abc";
        String s2=(String) s1.clone();
    }    
}

为什么这个简单的测试程序不起作用?

【问题讨论】:

  • 在什么情况下不起作用?
  • 线程“main”中的异常 java.lang.RuntimeException:无法编译的源代码 - 未报告的异常 java.lang.CloneNotSupportedException;必须在 test.Test.main(Test.java:9) 捕获或声明抛出 Java 结果:1

标签: java clone


【解决方案1】:

clone 是 Object 类的一个方法。对于要“可克隆”的类,它应该实现标记 Cloneable 接口。 String 类没有实现这个接口,也没有覆盖 clone 方法,因此报错。

我希望上面的 sn-p 是出于教育目的,因为您永远不应该觉得需要在 Java 中的字符串上调用 clone,因为:

  1. Java 中的字符串是不可变的。随意在方法/类之间分享它们
  2. 已经存在构造函数new String(String),它的作用类似于复制构造函数,几乎等同于您的clone() 调用。

【讨论】:

  • 有效的 Java 项目 11:明智地覆盖克隆。 (或者更好的是,只使用复制构造函数等而不是克隆。)
  • 它无法编译。 clone 不是 Cloneable 中的公共方法,因此实现它并不重要。
【解决方案2】:

Object.clone() 受到保护。这是一个很难使用的 API。

通常当通过扩大方法的可见性扩展 Object 时公开clone()

克隆任何字符串没有什么意义,因为它既是final 又是不可变的

复制字符串是有原因的;可以这样做:

String s1 = ...;
String s2 = new String(s1)

【讨论】:

  • 很少需要复制一个字符串,而且你还没有解释为什么要复制(this question 这样做)。
【解决方案3】:

clone() 是 Object 类的受保护方法。如果您希望一个类可克隆,一般模式是实现 Cloneable 并将该方法公开。

【讨论】:

    【解决方案4】:

    显然无法编译。 Object.clone 具有受保护的访问权限。

    除了可以在类本身中访问之外,还可以在 同样的包...,受保护的成员也可以从 通过与 至少相同类型的对象引用进行分类 班级

    【讨论】:

      【解决方案5】:

      要使一个类“可克隆”,它应该实现标记可克隆接口。 String 类没有实现这个接口,也没有覆盖 clone 方法,因此报错。

      protected Object clone() throws CloneNotSupportedException 创建并返回此对象的精确副本(克隆)。

      Java 中的字符串是不可变的。随意在方法/类之间分享它们 已经存在一个构造函数 new String(String),它的作用类似于复制构造函数,几乎等同于您的 clone() 调用。

      通常当通过扩展方法的可见性扩展 Object 时公开 clone()。

      克隆任何字符串都没有什么意义,因为它既是最终的又是不可变的。

      【讨论】:

        猜你喜欢
        • 2011-11-14
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 2011-02-12
        • 2018-08-20
        相关资源
        最近更新 更多