机上ではやっと気づいたけど、詳しくやらないといけないのは分かっている
- Autou 那は Qu に、生きた水の源が来たほどはっきりしているように頼みました - Zhu Xi クローンと
コピー
人P1 =
新しい
人 p2=p1; この時点では、p1 と p2 は両方ともメモリ内の同じオブジェクトを指しています。相手。 関数の引数がオブジェクトの場合、参照型が渡され、オブジェクト関数内の演算が外部オブジェクトに影響を与えます。 オブジェクトのコピーを転送したい場合は、objectの clone() メソッドを使用する必要があります。 ) コピー オブジェクトは参照ではなく新しいオブジェクトを返します。コピー オブジェクトと new 演算子によって返される新しいオブジェクトの違いは、コピー オブジェクトには初期情報ではなく、元のオブジェクトの情報が既に含まれていることです。オブジェクトの。 いつ使用するかhallow クローン (浅いコピー、シャドウ コピー) 、いつ 深いクローン (ディープ コピー) を使用するか: 主に、特定のドメイン オブジェクトの性質によって異なります。 基本タイプの場合は、浅いクローン を使用します。参照 変数 (参照 変数 ) はディープ クローン を使用します。 クローン作成の実装手順: (1) Cloneableインターフェースを実装します。Cloneableには、フラグインターフェースと呼ばれる抽象メソッドがありません。 (2) 基本クラスの clone メソッドをオーバーライドして public として宣言(3) 派生クラスの clone メソッドをオーバーライドして super.clone() を呼び出す
データ型(String) は新しいオブジェクトをコピーします
(2) 参照オブジェクトは引き続き同じオブジェクトを参照します。
浅いコピーのサンプルコード:public class Info { public int idnumber; public int getIdnumber() { return idnumber; } public void setIdnumber(int idnumber) { this.idnumber = idnumber; } } public class Person implements Cloneable{ private int age; private String nameString; public Info info; public Info getInfo() { return info; } public void setInfo(Info info) { this.info = info; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } public String toString() { return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber; } public Object clone() { Person person=null; try { person=(Person)super.clone(); //浅拷贝 //person.info=(Info)info.clone(); } catch (CloneNotSupportedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return person; } } public class Hello { public static void main(String[] args) { // TODO 自动生成的方法存根 Info info=new Info(); info.setIdnumber(100); Person person1=new Person(); person1.setAge(10); person1.setNameString("tiantian"); person1.info=info; Person person2=(Person)person1.clone(); person2.setNameString("hello"); person2.setAge(20); person2.info.setIdnumber(200); System.out.println("person2"+person2); System.out.println("person1"+person1); } }
person2name:hello,age:20,idnumber200 person1name:tiantian,age:10,idnumber200
(1)对存在的引用类型也进行拷贝,浅拷贝与深拷贝的代码还是有不同点的。
深拷贝代码示例:
public class Info implements Cloneable {//Info也进行拷贝 public int idnumber; public int getIdnumber() { return idnumber; } public void setIdnumber(int idnumber) { this.idnumber = idnumber; } public Object clone() { Info info=null; try { info=(Info)super.clone(); } catch (CloneNotSupportedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return info; } } public class Person implements Cloneable{ private int age; private String nameString; public Info info; public Info getInfo() { return info; } public void setInfo(Info info) { this.info = info; } public Person() { // TODO 自动生成的构造函数存根 } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } public String toString() { return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber; } public Object clone() { Person person=null; try { person=(Person)super.clone(); //浅拷贝 person.info=(Info)info.clone();//加上这一句就变成了深拷贝,对对象引用也进行一次拷贝 } catch (CloneNotSupportedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return person; } }
结果:
person2name:hello,age:20,idnumber200 person1name:tiantian,age:10,idnumber100
所有的值都进行了改变。
以上がJava クローン コード例の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。