2012-02-06 60 views
7
import java.util.*; 
import java.lang.*; 

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

爲什麼這個簡單的測試程序不起作用?java中的克隆()

+6

它以什麼方式不起作用? – Jivings 2012-02-06 17:10:15

+0

線程「main」中的異常java.lang.RuntimeException:不可編譯的源代碼 - 未報告的異常java.lang.CloneNotSupportedException;明智覆蓋克隆:必須被捕獲或者聲明在test.Test.main(Test.java:9) Java結果被拋出 \t:1 – user1192813 2012-02-06 17:12:32

回答

19

clone是Object類的一個方法。對於一個類是「可複製」的,它應該實現標記Cloneable接口。 String類沒有實現這個接口,並且不覆蓋克隆方法,因此錯誤。

我希望上面的代碼是用於教育目的,因爲你永遠不應該感到需要調用clone給出Java中的字符串是:

  1. 字符串在Java中是不可變的。隨意通過方法/類共享它們
  2. 已經存在一個構造函數new String(String),它的作用類似於複製構造函數,與您的clone()調用非常相似。
+2

有效的Java項目11。 (或者甚至更好,只是使用複製構造函數等克隆以外的其他東西。) – 2012-02-06 17:14:56

+0

嘿,downvote這篇文章,去圖。 – 2012-02-06 17:30:18

+1

它不編譯。 clone不是'Cloneable'中的公共方法,所以實現這一點無關緊要。 – 2012-02-06 18:21:31

6

Object.clone()受保護。這是一個棘手的API使用。

當通過擴展方法的可見性擴展Object時,通常會暴露clone()

克隆在任何字符串上都沒什麼意義,因爲它既是final也是不可變的

有一個複製字符串的原因;可以用:

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

很少需要複製一個字符串,而且你還沒有解釋爲什麼會這樣([這個問題])(http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression新的字符串在Java)))。 – 2012-02-06 17:17:14

1

clone()是對象類的受保護方法。如果你想要一個類是可複製的,那麼通用模式是實現Cloneable並公開該方法。

1

顯然無法編譯。 Object.clone已保護訪問權限。

除了是類本身和到 同一包中的代碼中訪問...,被保護的構件,也可以從一個 類通過對象引用是至少相同類型作爲訪問 類

1

的java.lang.Cloneable 接口必須由我們要建立其對象克隆的類實現。如果我們不實現 Cloneable接口,clone()方法生成CloneNotSupportedException的

clone()方法在Object類中定義。克隆()方法的語法如下:

protected Object clone() throws CloneNotSupportedException 
0

對於一類是「可複製」,它應該實現標記Cloneable接口。 String類不會實現這個接口,並且不會覆蓋克隆方法,因此會導致錯誤。

受保護的對象clone()拋出CloneNotSupportedException創建並返回此對象的確切副本(克隆)。

Java中的字符串是不可變的。隨意通過方法/類共享它們 已經存在一個構造函數new String(String),它的作用類似於複製構造函數,與clone()調用非常相似。

一般一個暴露克隆()當一個通過擴大該方法的可見性延伸的Object。

克隆任意字符串就沒有什麼意義,因爲它既是最後的和不可改變的。