二十三、オブジェクトクローン


1.クローン導入
実際のプログラミングプロセスでは、ある時点でAが対応する属性値を保存し、これらの値自体が有効である場合、Aと完全に同じオブジェクトBが必要であり、Bの裏面の属性値が変化した場合、Aの属性値は影響を受けず、AとBが独立していると理解できる場合があります.しかし、Bの初期化は私たちが普段このオブジェクトを作成するときの初期化操作ではなく、Bの初期化データはA.Javaストレージモデルについてよく知っている人から完全に来ており、Javaでは2つのオブジェクト参照に対して付与操作を行う場合、2つの参照を同じオブジェクトに指向させるだけであることはよく知られています.一方の参照内のオブジェクト属性が変化すると他方のオブジェクト属性が変化することに影響するため、Java言語自体のオブジェクト付与文は上記の要件を満たすことができない.
この場合、Objectクラスの共通メソッドclone()を使用する必要があります.ここでは、clone()メソッドで作成するオブジェクトは、ソースオブジェクトのコピーとみなすことができる新しいオブジェクトですが、メモリスタックでは、このコピーに新しいオブジェクトストレージスペースを割り当てる、そのオブジェクトのすべての状態を格納します.
2.クローン操作
Objectクラスは、クローン操作を実行する方法を提供します.
protected Object clone() throws CloneNotSupportedExcepton
クローンされたオブジェクトが存在するクラスは、識別インタフェースにすぎないCloneableインタフェースを実装する必要がある.
例1:
class AClass implements Cloneable {  
        public int a = 0;  

        public Object clone() {  
            AClass o = null;  
            try {  
                o = (AClass) super.clone();  
            } catch (CloneNotSupportedException ex) {  
                ex.printStackTrace();  
            }  

            return o;  
        }  
    }

オブジェクトを呼び出すclone()メソッドだけで、新しいオブジェクトをコピーでき、元の参照とは異なります.
例2:
package com.ares.clonedemo; 

class Person implements Cloneable {//              
	private String name; 
	public Person(String name) { 
		this.name = name; 
	} 
	public String getName() { 
		return name; 
	} 
	public void setName(String name) { 
		this.name = name; 
	} 
	public String toString() { 
		return "  :" + this.getName(); 
	} 
	public Object clone() throws CloneNotSupportedException { 
		return super.clone();   //         ,           .
	} 
} 

public class CloneDemo { 
	public static void main(String[] args) throws CloneNotSupportedException { 
		Person per1 = new Person("  "); 
		Person per2 = (Person)per1.clone() ;		 
		per2.setName("  ") ; 
		System.out.println(per1) ; 
		System.out.println(per2) ; 
	} 
}

3.クローン作成に関する注意事項
①オブジェクトclone機能を提供することを望むクラスはjavaにあるCloneableインタフェースを実現しなければならない.langバッグの中
②対象clone機能を提供したいクラスはclone()メソッドをリロードしなければならない.リロードプロセスでこの文を見ることができる:super.clone();すなわち,cloneクラスの継承構造にかかわらず,オブジェクトコピー時にObjectのclone()メソッドを直接または概要的に呼び出す.また、Objectのcloneメソッドがprotectedドメインであることに注意すると、このメソッドはObjectのサブクラスのみが呼び出すことができ、リロード時にcloneメソッド修飾子をpublicに変更する.
③もう一つ重要なのは、Objectのソースコードの中のclone()メソッドがnativeメソッドであることである.一般的に、JVMにとってnativeメソッドの効率はjavaの一般的なメソッドよりはるかに高い.これは、newではなく、オブジェクトをコピーするときにObjectのclone()メソッドを使用する理由である.
④Cloneableインタフェースは私たちがIOプログラムを作成する時にインターフェースをシーケンス化するのと同じで、ただ1つのフラグで、このインタフェースはいかなる方法を含まないので、このフラグは主にObjectクラスの中のclone方法を検出するためで、もし私たちが定義したクラスがコピー機能を実現したいならば、しかしこのインタフェースを実現していないでObjectのclone方法を呼び出して、文中のcatchブロックに異常なエラーが発生し、C l o n e N otSupportedExceptionが放出されます.
参照先:http://289972458.iteye.com/blog/1326413
20150430
JAVA学習ノートシリーズ
--------------------------------------------
連絡先
--------------------------------------------
        Weibo: ARESXIONG
        E-Mail: [email protected]
------------------------------------------------