1保護されたネイティブオブジェクトclone()は、clonenotsupportedexceptionをスローします。
1。ネイティブキーワードによって変更されたメソッド
Javaのネイティブキーワードは、この方法がローカルな方法であることを示しています[Javaネイティブの説明]。さらに、ネイティブ修正方法の実行効率は、非ネイティブ修正の効率よりも高くなっています。
2。メソッドは保護されて変更されます
クラスがclone()メソッドをオーバーライドする場合、他のすべてのクラスがこのクラスのこの方法にアクセスできるようにするために、パブリックアクセス修飾子に変更する必要があります。
3.メソッドは、 CloneNotsuptedExceptionの例外をスローします
クラスがclone()メソッドをオーバーライドしたい場合、 java.lang.clonableインターフェイス自体を実装する必要があります。そうしないと、クロネノッツサポートエクセプトがスローされます。
2。clone()の役割
注:ここのオブジェクトは、具体的に複雑なタイプを指します。
1。Simple=操作
Javaの複雑なタイプのオブジェクトはすべて参照タイプであり、多くの場合、オブジェクトのメモリアドレスを保存します。したがって、値操作を=演算子として単純に割り当てることはできません。オブジェクトAを別のオブジェクトBに割り当て、オブジェクトAのメモリアドレスをBに割り当てるだけで、両方が同じメモリアドレスを指しているようにします。これの結果は、1つのオブジェクトの変更が他のオブジェクトに影響することです。次の図を示しています。
人P1 = new Person();人P2 = P1;
2。clone()
clone()メソッドを使用すると、オブジェクトのコピーをすばやく作成でき、2つのオブジェクトは異なるメモリアドレスを指します。次の図を示しています。
人P1 = new Person();人P2 = P1.Clone();
3。浅いクローンとディープクローン、浅いクローン(浅いコピー)
浅いクローンとは、クローンオブジェクトではなく、クローンオブジェクト自体のフィールドを指します。 super.clone()のみを呼び出し、浅いクローンだけを呼び出します。コピーされたオブジェクトは異なるメモリアドレスを指していますが、オブジェクト内のフィールドは、以前のオブジェクトと同じメモリアドレスを指しています。
パブリッククラスの浅いクローンは、クローン可能{public string name;公共のint年齢;公的人の人; public shallowclone(){} public shallowclone(string name、int age、person person){this.name = name; this.age = age; this.person = person; } @Override public shallowclone clone(){shallowclone c = null; try {c =(shallowclone)super.clone(); c; } catch(clonenotsupportedexception e){e.printstacktrace(); } return c; } public static void main(string [] args){person p = new person(); p.name = "p"; p.age = 10; shallowclone c1 = new shallowclone( "Jim"、18、p); System.out.printf( "クローンの前:c1 =%s、c1.person =%s/n"、c1、c1.person); shallowclone c2 = c1.clone(); System.out.Printf( "後のクローン:C2 =%S、C2.Person =%S/N"、C2、C2.Person); }}Main()出力を実行します:
before clone: c1 = cre.sample.test.object.ShallowClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1after clone: c2 = cre.sample.test.object.ShallowClone@742808b3, c2.person = cre.sample.test.person@2dcb25f1
このようにして、ShallowCloneオブジェクトのメモリアドレスは変更されましたが、オブジェクト内の人フィールドのメモリアドレスは変更されていません。
2。ディープクローン(ディープコピー)
ディープクローンは、クローンオブジェクト自体のフィールドとクローンオブジェクトを指します。
/*** 2016/6/9にCREGUによって作成されたディープクローンコードの例* */public class deepcloneはcloneable {public string name;公共のint年齢;公的人の人; public deepclone(){} public deepclone(string name、int age、person person){this.name = name; this.age = age; this.person = person; } @Override public deepclone clone(){deepclone c = null; try {c =(deepclone)super.clone(); c.person = person.clone(); c; } catch(clonenotsupportedexception e){e.printstacktrace(); } return c; } public static void main(string [] args){person p = new person(); p.name = "p"; p.age = 10; DeepClone C1 = new DeepClone( "Jim"、18、p); System.out.printf( "クローンの前:c1 =%s、c1.person =%s/n"、c1、c1.person); deepclone c2 = c1.clone(); System.out.Printf( "後のクローン:C2 =%S、C2.Person =%S/N"、C2、C2.Person); }}Main()出力を実行します:
クローンの前:c1 = cre.sample.test.object.deepclone@558385e3、c1.person = cre.sample.test.person@2dcb25f1after clone:c2 = cre.sample.test.object.deepclone@742888b3、c2.person = cre.sample.test.person@70535b58
この場合、DeepCloneオブジェクトのメモリアドレスが変更されましたが、オブジェクト内の人フィールドのメモリアドレスも変更されました。
Javaオブジェクトのクローン法の上記の包括的な分析は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。