import java.util.*;
import java.lang.*;
public class Test{
public static void main(String[] argv){
String s1="abc";
String s2=(String) s1.clone();
}
}
为什么这个简单的测试程序不能工作?
import java.util.*;
import java.lang.*;
public class Test{
public static void main(String[] argv){
String s1="abc";
String s2=(String) s1.clone();
}
}
clone
是Object类的一个方法。要使一个类可“克隆”,它应该实现标记接口Cloneable
。由于String
类没有实现该接口且没有重写clone
方法,因此会出现错误。
希望以上片段是为教育目的而写的,因为在Java中您永远不需要调用字符串的clone
方法,因为:
new String(String)
,它充当复制构造函数,并且与您的clone()
调用基本相同。clone
不是 Cloneable
中的公共方法,因此实现它并没有什么意义。 - Tom Hawtin - tacklineObject.clone()
是受保护的API,使用起来比较棘手。
通常情况下,当我们通过扩展Object类来拓展方法的可见性时,我们会暴露clone()
方法。
对于任何字符串来说,克隆都没有太大意义,因为它既是final
的,又是不可变的。
复制字符串有其必要性,可以使用以下方式实现:
String s1 = ...;
String s2 = new String(s1)
它显然无法编译。Object.clone
受到保护的访问权限。
除了在类本身和同一包内的代码中可访问之外,受保护的成员还可以通过与该类至少相同类型的对象引用从类中访问
一个类要想被“克隆”,应该实现Cloneable接口。String类没有实现这个接口,也没有覆盖clone方法,因此会出错。
protected Object clone() throws CloneNotSupportedException 创建并返回该对象的精确拷贝(克隆)。
Java中的字符串是不可变的。可以在方法/类之间共享它们。 已经存在一个构造函数new String(String),它像一个复制构造函数,并且与你的clone()调用几乎相等。
通常情况下,当扩展Object时才暴露clone()方法,以扩大该方法的可见性。
对于任何字符串来说,克隆都没有多少意义,因为它是final和不可变的。