欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

Java的new和克隆的區別

錢衛國1年前7瀏覽0評論

在Java編程中,我們經常使用new和克隆(clone)來創建對象。雖然這兩個方法都可以用于創建對象,但它們之間有著非常重要的區別。下面將詳細介紹它們的區別。

首先,從語法上來看,new是關鍵字,而克隆是Object類的一個方法。new可以直接在類中實例化對象,而克隆必須在需要克隆的類中實現Cloneable接口,并重寫Object類中的clone()方法。

// 使用new關鍵字創建對象
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// ...
}
Person p = new Person("張三", 18);
// 使用克隆方法創建對象
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創建的對象是全新的,而克隆創建的對象與原對象相似。具體來說,new創建的對象與原對象在內存中是兩個不同的對象,它們的所有屬性都是獨立的。而克隆創建的對象與原對象在內存中是同一個對象,它們的基本類型的屬性是獨立的,但引用類型的屬性是共享的。

// new創建的對象
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); // "王五"
// 克隆創建的對象
public class Person implements Cloneable {
String name;
Integer age;
Listhobbies;
public Person(String name, Integer age, Listhobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
// ...
@Override
public Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
ListnewHobbies = 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創建的對象可以在任何時候銷毀,而克隆創建的對象會一直存在于內存中,直到手動再次銷毀為止。

綜上所述,new和克隆都是用于創建對象的方法,但它們之間有著非常明顯的區別。我們在使用時應根據具體情況選擇合適的方式。