在Java編程中,我們經(jīng)常使用new和克?。╟lone)來創(chuàng)建對(duì)象。雖然這兩個(gè)方法都可以用于創(chuàng)建對(duì)象,但它們之間有著非常重要的區(qū)別。下面將詳細(xì)介紹它們的區(qū)別。
首先,從語法上來看,new是關(guān)鍵字,而克隆是Object類的一個(gè)方法。new可以直接在類中實(shí)例化對(duì)象,而克隆必須在需要克隆的類中實(shí)現(xiàn)Cloneable接口,并重寫Object類中的clone()方法。
// 使用new關(guān)鍵字創(chuàng)建對(duì)象 public class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } // ... } Person p = new Person("張三", 18);
// 使用克隆方法創(chuàng)建對(duì)象 public class Person implements Cloneable { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } // ... @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } Person p = new Person("張三", 18); Person p2 = (Person) p.clone();
其次,new創(chuàng)建的對(duì)象是全新的,而克隆創(chuàng)建的對(duì)象與原對(duì)象相似。具體來說,new創(chuàng)建的對(duì)象與原對(duì)象在內(nèi)存中是兩個(gè)不同的對(duì)象,它們的所有屬性都是獨(dú)立的。而克隆創(chuàng)建的對(duì)象與原對(duì)象在內(nèi)存中是同一個(gè)對(duì)象,它們的基本類型的屬性是獨(dú)立的,但引用類型的屬性是共享的。
// new創(chuàng)建的對(duì)象 Person p = new Person("張三", 18); Person p2 = new Person("李四", 20); System.out.println(p.name); // "張三" System.out.println(p2.name); // "李四" p2 = p; p2.name = "王五"; System.out.println(p.name); // "王五" System.out.println(p2.name); // "王五"
// 克隆創(chuàng)建的對(duì)象 public class Person implements Cloneable { String name; Integer age; Listhobbies; public Person(String name, Integer age, List hobbies) { this.name = name; this.age = age; this.hobbies = hobbies; } // ... @Override public Object clone() throws CloneNotSupportedException { Person p = (Person) super.clone(); List newHobbies = new ArrayList<>(); for (String hobby : p.hobbies) { newHobbies.add(hobby); } p.hobbies = newHobbies; return p; } } Person p = new Person("張三", 18, Arrays.asList("籃球", "游泳")); Person p2 = (Person) p.clone(); System.out.println(p.hobbies); // ["籃球", "游泳"] System.out.println(p2.hobbies); // ["籃球", "游泳"] p2.hobbies.add("跑步"); System.out.println(p.hobbies); // ["籃球", "游泳"] System.out.println(p2.hobbies); // ["籃球", "游泳", "跑步"]
最后,new創(chuàng)建的對(duì)象可以在任何時(shí)候銷毀,而克隆創(chuàng)建的對(duì)象會(huì)一直存在于內(nèi)存中,直到手動(dòng)再次銷毀為止。
綜上所述,new和克隆都是用于創(chuàng)建對(duì)象的方法,但它們之間有著非常明顯的區(qū)別。我們?cè)谑褂脮r(shí)應(yīng)根據(jù)具體情況選擇合適的方式。