2012-02-06 7 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(); 
    }  
} 

なぜこの簡単なテストプログラムは機能しませんか?クローン()in java

+6

どのように動作しませんか? – Jivings

+0

スレッド "main"の例外java.lang.RuntimeException:コンパイル不能なソースコード - 未報告の例外java.lang.CloneNotSupportedException;キャッチまたは宣言されている必要があります \t test.Test.main(Test.java:9) Javaの結果:1 – user1192813

答えて

19

cloneは、Objectクラスのメソッドです。クラスが「複製可能」になるには、マーカCloneableのインタフェースを実装する必要があります。 Stringクラスはこのインタフェースを実装していないため、クローンメソッドをオーバーライドしないため、エラーになります。あなたがいることを、指定されたJavaの文字列にcloneを呼び出す必要が感じることはありませんので、私は上記のスニペットは教育目的のためであると思います

:Javaで

  1. 文字列は不変です。メソッド/クラス間で自由に共有してください
  2. コピーコンストラクタのように動作するコンストラクタnew String(String)が既に存在し、clone()呼び出しとほぼ同等です。
+2

有効なJavaアイテム11:慎重にクローンをオーバーライドします。 (または、さらに良いのは、クローン以外のコピーコンストラクタなどを使用してください。) –

+0

この投稿は下向きです。 –

+1

コンパイルされません。 'clone'は' Cloneable'のパブリックメソッドではないので、それを実装することは重要ではありません。 –

6

Object.clone()は保護されている。これは使いやすいAPIです。

通常、メソッドの可視性を広げることによってオブジェクトを拡張するときに、clone()が公開されます。

いずれの文字列のクローンも、finalの両方が不変のであるため、意味がありません。

文字列をコピーする理由があります。

+1

文字列をコピーする必要はまれで、その理由を説明していません([この質問](http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression -new-string-in-java)を実行します)。 –

1

clone()は、Objectクラスの保護されたメソッドです。クラスを複製可能にするには、一般的なパターンはCloneableを実装し、そのメソッドをpublicにします。

1

明らかにコンパイルできませんでした。 Object.cloneにはアクセス権が保護されています。

超えとして...、保護部材はまた、であるオブジェクト参照を介し クラスからアクセス可能な少なくとも同じタイプクラス自体の中にアクセス可能と 同じパッケージ内に符号化します クラス

1

java.lang.Cloneable インタフェースがそのオブジェクトのクローン私たちが作成するクラスによって実装されなければなりません。 Cloneableインターフェイスを実装していない場合、clone()メソッドはCloneNotSupportedExceptionを生成します。

clone()メソッドは、Objectクラスで定義されています。 clone()メソッドの構文は次のとおりです。

protected Object clone() throws CloneNotSupportedException 
0

クラスを「複製可能」にするには、マーカーCloneableインターフェイスを実装する必要があります。 Stringクラスはこのインタフェースを実装していないため、エラーが発生したクローンメソッドをオーバーライドしません。

プロテクトオブジェクトclone()throw CloneNotSupportedExceptionは、このオブジェクトの正確なコピー(クローン)を作成して返します。

Javaの文字列は不変です。メソッド/クラス間で自由に共有してください コピーコンストラクタのように動作するコンストラクタnew String(String)がすでに存在し、これはclone()呼び出しとほぼ同等です。

通常、メソッドの可視性を広げてオブジェクトを拡張するときにclone()を公開します。

すべての文字列のクローンは、最終的で不変なので意味がありません。