日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对象的拷贝

發布時間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对象的拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對象的拷貝又被成為對象的克隆。對象的拷貝分為兩種:淺拷貝和深拷貝。

淺拷貝

淺復制(淺克隆)被復制對象的所有變量都含有與原來對象相同的值,而所有的對其他對象的引用仍然只指向原來的對象,換言之,淺復制僅僅復制鎖考慮的對象,而不復制它所引用的對象。

對象的淺拷貝是通過調用clone方法來實現的。

淺拷貝需要注意的細節:

1. 如果一個對象需要調用clone的方法克隆,那么該對象所屬的類必須要實現Cloneable接口。
2. Cloneable接口只不過是一個標識接口而已,沒有任何方法。
3. 對象的淺克隆也不會調用到構造方法的。

代碼示例:

1 //實體類代碼 2 class Address{ 3 4 String city; 5 6 public Address(String city){ 7 this.city = city; 8 } 9 10 } 11 12 public class Person implements Cloneable{ 13 int id; 14 15 String name; 16 17 Address address; 18 19 public Person(int id, String name) { 20 this.id = id; 21 this.name = name; 22 } 23 public Person(int id, String name, Address address) { 24 this.id = id; 25 this.name = name; 26 this.address = address; 27 System.out.println("=======構造方法調用了==="); 28 } 29 @Override 30 public String toString() { 31 return "編號:"+ this.id+" 姓名:"+ this.name+" 地址:"+ address.city; 32 } 33 @Override 34 public Object clone() throws CloneNotSupportedException { 35 return super.clone(); 36 } 37 } 38 //測試類代碼 39 public class DemoCopy { 40 public static void main(String[] args) throws CloneNotSupportedException { 41 Person p1 = new Person(110, "Nick",new Address("濟南")); 42 Person p2 = (Person)p1.clone(); 43 p2.address.city = "北京"; 44 System.out.println("p1的內容:"+p1); 45 System.out.println("p2的內容:"+p2); 46 } 47 } View Code

深拷貝

深復制(深克隆)被復制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量,那些引用其他對象的變量將指向被復制過的新對象,而不再試原有的那些被引用的對象,換言之,深復制把要復制的對象所引用的對象都復制了一遍。

把對象寫到流里的過程是串行化(Serilization)過程,但是在Java程序師圈子里又非常形象地稱為“冷凍”或者“腌咸菜(picking)”過程;而把對象從流中讀出來的并行化(Deserialization)過程則叫做“解凍”或者“回鮮(depicking)”過程。應當指出的是,寫在流里的是對象的一個拷貝,而原對象仍然存在于JVM里面,因此“腌成咸菜”的只是對象的一個拷貝,Java咸菜還可以回鮮。

在Java語言里深復制一個對象,常常可以先使對象實現Serializable接口,然后把對象(實際上只是對象的一個拷貝)寫到一個流里(腌成咸菜),再從流里讀出來(把咸菜回鮮),便可以重建對象。

對象的深拷貝是通過對象輸入(ObjectInputStream)輸出(ObjectOutputStream)流來實現的。

示例代碼如下:

1 //實體類代碼 2 class Address implements Serializable{ 3 4 String city; 5 6 public Address(String city){ 7 this.city = city; 8 } 9 10 } 11 12 public class Person implements Serializable{ 13 int id; 14 15 String name; 16 17 Address address; 18 19 public Person(int id, String name) { 20 this.id = id; 21 this.name = name; 22 } 23 public Person(int id, String name, Address address) { 24 this.id = id; 25 this.name = name; 26 this.address = address; 27 System.out.println("=======構造方法調用了==="); 28 } 29 @Override 30 public String toString() { 31 return "編號:"+ this.id+" 姓名:"+ this.name+" 地址:"+ address.city; 32 } 33 34 } 35 //測試代碼 36 public class Demo2 { 37 38 public static void main(String[] args) throws IOException, ClassNotFoundException { 39 Address address = new Address("廣州"); 40 Person p1 = new Person(110,"狗娃",address); 41 writeObj(p1); 42 Person p2 =readObj(); 43 44 p2.address.city = "長沙"; 45 System.out.println("p1:"+ p1); 46 System.out.println("p2:"+ p2); 47 48 49 } 50 51 52 //再從文件中讀取對象的信息 53 public static Person readObj() throws ClassNotFoundException, IOException{ 54 FileInputStream fileInputStream = new FileInputStream("F:\\obj.txt"); 55 //創建對象的輸入流對象 56 ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 57 return (Person) objectInputStream.readObject(); 58 } 59 60 61 //先要把對象寫到文件上。 62 public static void writeObj(Person p) throws IOException{ 63 //建立一個文件 的輸出流對象 64 FileOutputStream fileOutputStream = new FileOutputStream("F:\\obj.txt"); 65 //建立對象的輸出流 66 ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 67 //把對象寫出 68 objectOutputStream.writeObject(p); 69 //關閉資源 70 objectOutputStream.close(); 71 72 } 73 } View Code

?

?

?

?

?

轉載于:https://www.cnblogs.com/nicker/p/6273945.html

總結

以上是生活随笔為你收集整理的对象的拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。