Java中的Clone()方法

7
import java.util.*;
import java.lang.*;

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

为什么这个简单的测试程序不能工作?

6
它为什么不能正常工作? - Jivings
主线程异常:"main" java.lang.RuntimeException: 无法编译的源代码 - 未报告的异常java.lang.CloneNotSupportedException; 必须捕获或声明为抛出 在test.Test.main(Test.java:9) Java结果:1 - user1192813
5个回答

20

clone是Object类的一个方法。要使一个类可“克隆”,它应该实现标记接口Cloneable。由于String类没有实现该接口且没有重写clone方法,因此会出现错误。

希望以上片段是为教育目的而写的,因为在Java中您永远不需要调用字符串的clone方法,因为:

  1. Java中的字符串是不可变的。可以在方法/类之间共享它们
  2. 已经存在一个构造函数new String(String),它充当复制构造函数,并且与您的clone()调用基本相同。

2
有效的Java第11条款:明智地重写clone方法(或者更好的方式是使用复制构造函数等其他方式而不是clone)。 - Louis Wasserman
1
它无法编译。clone 不是 Cloneable 中的公共方法,因此实现它并没有什么意义。 - Tom Hawtin - tackline

6

Object.clone()是受保护的API,使用起来比较棘手。

通常情况下,当我们通过扩展Object类来拓展方法的可见性时,我们会暴露clone()方法。

对于任何字符串来说,克隆都没有太大意义,因为它既是final的,又是不可变的

复制字符串有其必要性,可以使用以下方式实现:

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

1
很少需要复制字符串,而且你没有解释为什么需要复制(这个问题也没有)。 - Matthew Flaschen

1

clone()是Object类的一个受保护方法。如果你想让一个类可克隆,通常的做法是实现Cloneable接口,并将该方法设为公有。


1

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

除了在类本身和同一包内的代码中可访问之外,受保护的成员还可以通过与该类至少相同类型的对象引用从类中访问


0

一个类要想被“克隆”,应该实现Cloneable接口。String类没有实现这个接口,也没有覆盖clone方法,因此会出错。

protected Object clone() throws CloneNotSupportedException 创建并返回该对象的精确拷贝(克隆)。

Java中的字符串是不可变的。可以在方法/类之间共享它们。 已经存在一个构造函数new String(String),它像一个复制构造函数,并且与你的clone()调用几乎相等。

通常情况下,当扩展Object时才暴露clone()方法,以扩大该方法的可见性。

对于任何字符串来说,克隆都没有多少意义,因为它是final和不可变的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接