# ç»æ°æµ æ·è´åæ·±æ·è´ * [ç»æ°æµ æ·è´åæ·±æ·è´](#ç»æ°æµ æ·è´åæ·±æ·è´) * [å ³äºå¼ç¨](#å ³äºå¼ç¨) * [å ³äºæµ æ·è´åæ·±æ·è´](#å ³äºæµ æ·è´åæ·±æ·è´) * [æµ æ·è´](#æµ æ·è´) * [æ·±æ·è´](#æ·±æ·è´) * [åºåå](#åºåå) * [å¦ä½éæ©æ·è´æ¹å¼](#å¦ä½éæ©æ·è´æ¹å¼) * [å ¶ä»æ·è´æ¹å¼](#å ¶ä»æ·è´æ¹å¼) * [ä¸äºè¯´æ](#ä¸äºè¯´æ) Java 对象æ·è´æ¯ä¸ºå¯¹è±¡èµå¼çä¸ç§æ¹å¼ï¼ç®åæ¥è¯´å°±æ¯å建ä¸ä¸ªåå对象ç¸åçå¯¹è±¡ï¼æ°å建ç对象æ¯å对象çä¸ä¸ª`坿¬`ï¼é¢è¯å®è´¼æå欢å¨é¢è¯çæ¶åé®ä¸é®ä½ æµ æ·è´åæ·±æ·è´çåçãå ä¸ºå®æ¶åå°å¯¹è±¡çå¼ç¨å ³ç³»ï¼æ¶åå° Java æ¯ä¼ å¼è¿æ¯ä¼ éå¼ç¨å ³ç³»ï¼è¿é常æ¯é¢è¯çéç¹ãæä»¥å¨èæ·±æ·è´åæµ æ·è´ä¹åï¼æä»¬å æ¥èä¸èå¼ç¨å ³ç³»ã ## å ³äºå¼ç¨ å¨ Java ä¸ï¼é¤äº**åºæ¬æ°æ®ç±»å**ï¼åç±»å «ç§æ°æ®ç±»åï¼ä¹å¤ï¼è¿åå¨å¼ç¨æ°æ®ç±»åãä¸è¬ä½¿ç¨ `=` å·åèµå¼æä½çæ¶åï¼å¯¹äºåºæ¬æ°æ®ç±»åï¼å®é 䏿¯æ·è´çå®çå¼ï¼ä½æ¯å¯¹äºå¯¹è±¡èè¨ï¼å ¶å®èµå¼çåªæ¯è¿ä¸ªå¯¹è±¡çå¼ç¨ï¼ä¹å°±æ¯å°å对象çå¼ç¨ä¼ éè¿å»ï¼ä½æ¯ä»ä»¬å®é ä¸è¿æ¯æåçåä¸ä¸ªå¯¹è±¡ãå¦ä¸ä»£ç æç¤º ```java public class Food{ String name; int num; String taste; constructor() get and set() toString() } ``` æµè¯ç±»ï¼ ```java public static void main(String[] args) { int i1 = 10; int i2 = i1; // åºæ¬æ°æ®ç±»åçæ·è´ï¼æ·è´å¼ System.out.println("i2 = " + i2); Food milk = new Food("milk",1,"fragrance"); Food food = milk; System.out.printf("food = " + food); System.out.println("milk = " + milk); // milk å food 齿ååä¸ä¸ªå å å对象 } ``` 妿ç¨å¾è¡¨ç¤ºçè¯ï¼åºè¯¥æ¯ä¸é¢è¿æ ·çï¼  > ä¸ç¨çº ç» Java ä¸å°åºæ¯å¼ä¼ éè¿æ¯å¼ç¨ä¼ éè¿ç§æ æä¹çäºè®ºä¸ï¼ä½ åªè¦è®°å¾å¯¹äºåºæ¬æ°æ®ç±»åï¼ä¼ éçæ¯æ°æ®ç±»åçå¼ï¼è对äºå¼ç¨ç±»åæ¥è¯´ï¼ä¼ éçæ¯å¯¹è±¡çå¼ç¨ï¼ä¹å°±æ¯å¯¹è±¡çå°åå°±å¯ä»¥äºã ## å ³äºæµ æ·è´åæ·±æ·è´ æµ æ·è´åæ·±æ·è´å ¶å®å°±æ¯å¨`å¼ç¨`çè¿ä¸ªåºç¡ä¸æ¥ååºåçï¼å¦æå¨æ·è´çæ¶åï¼åªå¯¹åºæ¬æ°æ®ç±»åè¿è¡æ·è´ï¼å¯¹å¼ç¨æ°æ®ç±»ååªæ¯è¿è¡äºå¼ç¨çä¼ éï¼æ²¡æçæ£çå建ä¸ä¸ªæ°ç对象ï¼è¿ç§æ·è´æ¹å¼å°±è®¤ä¸ºæ¯`æµ æ·è´`ãåä¹ï¼å¨å¯¹å¼ç¨æ°æ®ç±»åè¿è¡æ·è´çæ¶åï¼å建äºä¸ä¸ªæ°ç对象ï¼å¹¶ä¸å¤å¶å ¶å çæååéï¼è¿ç§æ·è´æ¹å¼å°±è¢«è®¤ä¸ºæ¯`æ·±æ·è´`ã ### æµ æ·è´ é£ä¹å¦ä½å®ç°`æµ æ·è´(Shallow copy)`å¢ï¼å¾ç®åï¼å°±æ¯å¨éè¦æ·è´çç±»ä¸å®ç° Cloneable æ¥å£å¹¶éåå ¶ clone() æ¹æ³å°±å¯ä»¥äºã ä¸é¢æä»¬å¯¹ Food ç±»è¿è¡ä¿®æ¹ï¼æä»¬è®©ä»å®ç° Cloneable æ¥å£ï¼å¹¶éå clone() æ¹æ³ã ```java public class Food implements Cloneable{ ... @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } ... } ``` ç¶å卿µè¯ç±»ä¸ç代ç å¦ä¸ ```java Food milk = new Food("milk",1,"fragrance"); Food food = (Food)milk.clone(); System.out.println("milk = " + milk); System.out.println("food = " + food); ``` å¯ä»¥çå°ï¼ç°å¨ç food 对象æ¯ç± milk 对象æ·è´åºæ¥çï¼é£ä¹æ¤æ¶ç food 对象å milk 对象æ¯åä¸ä¸ªå¯¹è±¡åï¼æä»¬éè¿æå°ï¼å¯ä»¥çå°è¿ä¸¤ä¸ªå¯¹è±¡çåç `hashcode`ã ```java milk = com.cxuan.objectclone.Food@3cd1a2f1 food = com.cxuan.objectclone.Food@4d7e1886 ``` å¯ä»¥åç°ï¼**food å milk 并䏿¯åä¸ä¸ªå¯¹è±¡**ï¼é£ milk ä¸è¿æä¸ä¸ªå±æ§å¼ï¼è¿ä¸ä¸ªå±æ§å¼å¨ food 䏿¯ä¸æ¯ä¹ä¸æ ·å¢ï¼ä¸ºäºéªè¯è¿ä¸ªçæ³ï¼æä»¬éåäº toString æ¹æ³ã ```java @Override public String toString() { return "Food{" + "name='" + name + '\'' + ", num=" + num + ", taste='" + taste + '\'' + '}'; } ``` ç¶å忬¡æå° food å milk ï¼å¯ä»¥è§å¯å°å¦ä¸ç»æ ```java milk = Food{name='milk', num=1, taste='fragrance'} food = Food{name='milk', num=1, taste='fragrance'} ``` å¯å¼ï¼è½ç¶çèµ·æ¥"cxuan å¥"å"cuan å¥"æ¯ä¸¤ç§å®å ¨ä¸åçç§°å¼ï¼ä½æ¯ä»ä»¬å´æä¸ç§å ±åçè½åï¼**åä½**ï¼ æä»¬è¿æ¯éè¿å¾ç¤ºæ¥è¯´æä¸ä¸ï¼  è¿å¹ å¾çåºé¨éäºä¹ï¼å¨å åºåå«åºç°äºä¸¤ä¸ª Food 对象ï¼è¿åæ¶è¡¨æ clone æ¹æ³ä¼éæ°å建ä¸ä¸ªå¯¹è±¡å¹¶ä¸ºå ¶åé ä¸åå ååºåï¼è½ç¶åºç°äºä¸¤ä¸ªå¯¹è±¡ï¼ä½æ¯ä¸¤ä¸ªå¯¹è±¡ä¸ç屿§å¼æ¯ä¸æ ·çï¼è¿ä¹æ¯æ¢æ±¤ä¸æ¢è¯ï¼è½ç¶æ±¤åè¯æ¯ä¸åçä¸è¥¿ï¼å¯¹è±¡ï¼ï¼ä½æ¯ä»ä»¬é½æº¶äºæ°´ï¼å±æ§å¼ï¼ã ### æ·±æ·è´ è½ç¶æµ æ·è´æ¯ä¸ç§æ¢æ±¤ä¸æ¢è¯ç说æ³ï¼ä½æ¯å¨ Java ä¸çä¸è¿æ¯æä¸ç§è¯´æ³æ¯ããããããæ¯å¥æ¥çï¼ è¯ç©·äºãããããã  å¦å¯¹ï¼è¿æä¸ç§æ¹å¤´æ¢é¢çå½¢å¼ï¼å®å°±æ¯æä»¬æçæç`æ·±æ·è´(Deep copy)`ï¼å æ¥æåºä¸ä¸æ·±æ·è´çå®ä¹ï¼**å¨è¿è¡å¯¹è±¡æ·è´çåºç¡ä¸ï¼å¯¹å¯¹è±¡çæååéä¹ä¾æ¬¡æ·è´çæ¹å¼è¢«ç§°ä¸ºæ·±æ·è´**ã ååååï¼è¿æ ä½é«æ·±çæ·±æ·è´åæ¥å°±æ¯å¨æµ æ·è´çåºç¡ä¸åå¤å¶ä¸ä¸å®ç屿§å¼åï¼æè¿ä»¥ä¸ºæ¯å¥é«æ·±çä¸è¥¿å¢ï¼ä¸ä»£ç ï¼ æä»¬å å¢å ä¸ä¸ªé¥®åç±» Drink ã ```java public class Drink implements Cloneable { String name; get and set() @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } toString() } ``` ç¶åæ´æ¹ä¸ä¸ Food ç±»ï¼å 为 Drink ä¹ç®æ¯ Food ï¼æä»¥æä»¬å¨ Food ç±»ä¸å¢å 对 Drink çå¼ç¨ï¼ç¶ååä¿®æ¹ get set ãtoString ãclone ãæé æ¹æ³ï¼ä¿®æ¹åç Food 类代ç å¦ä¸ ```java public class Food implements Cloneable{ String name; int num; String taste; Drink drink; public Food(String name, int num, String taste,Drink drink) { this.name = name; this.num = num; this.taste = taste; this.drink = drink; } get and set... @Override protected Object clone() throws CloneNotSupportedException { Food food = (Food)super.clone(); food.drink = (Drink) drink.clone(); return super.clone(); } @Override public String toString() { return "Food{" + "name='" + name + '\'' + ", num=" + num + ", taste='" + taste + '\'' + ", drink=" + drink + '}'; } } ``` å¯ä»¥çå°æå¤§çæ¹åæ¯ clone æ¹æ³ï¼æä»¬å¨ clone æ¹æ³ä¸ï¼å®ç°äºå¯¹ Food å¯¹è±¡çæ·è´ï¼åæ¶ä¹å®ç°äºå¯¹ Drink å¯¹è±¡çæ·è´ï¼è¿å°±æ¯æä»¬ä¸é¢æè¯´ç**å¤å¶å¯¹è±¡å¹¶å¤å¶å¯¹è±¡çæååé**ã ç¶åæä»¬è¿è¡ä¸ä¸ Deep Copyçæµè¯ï¼ ```java public static void main(String[] args) throws CloneNotSupportedException { Drink drink = new Drink("milk"); Food food = new Food("humberge",1,"fragrance",drink); Food foodClone = (Food)food.clone(); Drink tea = new Drink("tea"); food.setDrink(tea); System.out.println("food = " + food); System.out.println("foodClone = " + foodClone.getDrink()); } ``` è¿è¡å®æåçè¾åºç»æå¦ä¸ï¼ ```java food = Food{name='humberge', num=1, taste='fragrance', drink=Drink{name='tea'}} foodClone = Drink{name='milk'} ``` å¯ä»¥çå°ï¼æä»¬æ foodClone æ·è´åºæ¥ä¹åï¼ä¿®æ¹ food ä¸ç drink åéï¼å´ä¸ä¼å¯¹ foodClone é ææ¹åï¼è¿å°±è¯´æ foodClone å·²ç»æåå®ç°äºæ·±æ·è´ã ç¨å¾ç¤ºè¡¨ç¤ºçè¯ï¼åºè¯¥æ¯ä¸é¢è¿æ ·çï¼  è¿æ¯æ·±æ·è´ä¹åçå ååé å¾ï¼ç°å¨å¯ä»¥çå°ï¼food å foodClone å®å ¨æ¯ä¸¤ä¸ªä¸åç对象ï¼å®ä»¬ä¹é´ä¸åå¨çº½å¸¦å ³ç³»ã æä»¬ä¸é¢ä¸»è¦æ¢è®¨å®ç°å¯¹è±¡æ·è´çæ¹å¼æ¯å¯¹è±¡å®ç° `Cloneable` æ¥å£ï¼å¹¶ä¸è°ç¨éåä¹åç clone æ¹æ³ï¼å¨ Java ä¸ï¼è¿æä¸ç§å®ç°å¯¹è±¡æ·è´çæ¹å¼æ¯ä½¿ç¨ `åºåå`ã ### åºåå 使ç¨åºååçæ¹å¼ä¸»è¦æ¯ä½¿ç¨ `Serializable` æ¥å£ï¼è¿ç§æ¹å¼è¿ä»¥è§£å³å¤å±æ·è´çé®é¢ï¼**å¤å±æ·è´å°±æ¯å¼ç¨ç±»åéé¢åæå¼ç¨ç±»å**ï¼å±å±åµå¥ä¸å»ãä½¿ç¨ Serializable çå ³é®ä»£ç å¦ä¸ ```java public Person clone() { Person person = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); // å°æµåºååæå¯¹è±¡ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); person = (Person) ois.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return person; } ``` 使ç¨åºååå¯ä»¥å®ç°æ·±æ·è´ï¼å®çåçæ¯å°äºè¿å¶åèæµå 容åå°ä¸ä¸ªææ¬æåèæ°ç»ï¼ç¶åæ¯ä»è¿ä¸ªææ¬æè åèæ°ç»ä¸è¯»åæ°æ®ï¼å对象åå ¥è¿ä¸ªææ¬æè åèæ°ç»ååæ·è´ç» clone 对象ï¼å对象çä¿®æ¹ä¸ä¼å½±å clone 对象ï¼å 为 clone 对象æ¯ä»ææ¬æè åèæ°ç»ä¸è¯»åçã ### å¦ä½éæ©æ·è´æ¹å¼ å°ç°å¨æä»¬å·²ç»ææµ æ·è´åæ·±æ·è´é½ä»ç»å®äºï¼é£ä¹å¦ä½éæ©æµ æ·è´åæ·±æ·è´å¢ï¼ä¸é¢æ¯å ç¹æ³¨æäºé¡¹â ï¸ * å¦æå¯¹è±¡ç屿§é½æ¯åºæ¬æ°æ®ç±»åï¼é£ä¹å¯ä»¥ä½¿ç¨æµ æ·è´ã * å¦æå¯¹è±¡æå¼ç¨ç±»åï¼é£å°±è¦åºäºå ·ä½çéæ±æ¥éæ©æµ æ·è´è¿æ¯æ·±æ·è´ã * å¦æå¯¹è±¡åµå¥å±æ°æ¯è¾å¤ï¼æ¨èä½¿ç¨ Serializable æ¥å£å®ç°æ·±æ·è´ã * å¦æå¯¹è±¡å¼ç¨ä»»ä½æ¶åé½ä¸ä¼è¢«æ¹åï¼é£ä¹æ²¡å¿ è¦ä½¿ç¨æ·±æ·è´ï¼åªéè¦ä½¿ç¨æµ æ·è´å°±è¡äºãå¦æå¯¹è±¡å¼ç¨ç»å¸¸æ¹åï¼é£ä¹å°±è¦ä½¿ç¨æ·±æ·è´ã没æä¸æä¸åçè§åï¼ä¸åé½åå³äºå ·ä½éæ±ã ### å ¶ä»æ·è´æ¹å¼ é¤äºå¯¹è±¡çæ·è´ï¼Java ä¸è¿æä¾äºå ¶ä»çæ·è´æ¹å¼ æ¯å¦æ°ç»çæ·è´ï¼ä½ å¯ä»¥ä½¿ç¨ `Arrays.copyof` å®ç°æ°ç»æ·è´ï¼è¿å¯ä»¥ä½¿ç¨é»è®¤ç clone è¿è¡æ·è´ï¼ä¸è¿è¿ä¸¤è 齿¯æµ æ·è´ã ```java public void test() { int[] lNumbers1 = new int[5]; int[] rNumbers1 = Arrays.copyOf(lNumbers1, lNumbers1.length); int[] lNumbers2 = new int[5]; int[] rNumbers2 = lNumbers2.clone(); } ``` é¤äºåºæ¬æ°ç»æ°æ®ç±»åä¹å¤çæ·è´ï¼è¿æå¯¹è±¡çæ·è´ï¼ä¸è¿ç¨æ³åºæ¬æ¯ä¸æ ·çã éåä¹å¯ä»¥å®ç°æ·è´ï¼å 为éåçåºå±å°±ä½¿ç¨çæ¯æ°ç»ï¼æä»¥ç¨æ³ä¹æ¯ä¸æ ·çã ## ä¸äºè¯´æ é对 Cloneable æ¥å£ï¼æä¸é¢ä¸ç¹ä½¿ç¨è¯´æ * å¦æç±»å®ç°äº Cloneable æ¥å£ï¼åè°ç¨ Object ç clone() æ¹æ³**å¯ä»¥åæ³å°å¯¹è¯¥ç±»å®ä¾è¿è¡æå段å¤å¶**ã * 妿卿²¡æå®ç° Cloneable æ¥å£çå®ä¾ä¸è°ç¨ Object ç clone() æ¹æ³ï¼åä¼å¯¼è´æåº`CloneNotSupporteddException`ã * å®ç°æ¤æ¥å£çç±»åºè¯¥ä½¿ç¨å ¬å ±æ¹æ³éå Object çclone() æ¹æ³ï¼å 为 Object ç clone() æ¹æ³æ¯ä¸ä¸ªåä¿æ¤çæ¹æ³ã  