Java筆試試題如何實現對象克隆?
引導語:在java面向對象的編程當中,要複製引用類型的對象,就必須克隆這些對象。以下是本站小編分享給大家的Java筆試試題如何實現對象克隆?,歡迎參考學習!
如何實現對象克隆?
答:有兩種方式:
1). 實現Cloneable接口並重寫Object類中的clone()方法;
2). 實現Serializable接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆,代碼如下。
123456789101112131415161718192021222324 | import ArrayInputStream; import ArrayOutputStream; import ctInputStream; import ctOutputStream; public class MyUtil {
private MyUtil() {
throw new AssertionError();
}
public static <T> T clone(T obj) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
eObject(obj);
ByteArrayInputStream bin = new ByteArrayInputStream(teArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (T) Object();
// 説明:調用ByteArrayInputStream或ByteArrayOutputStream對象的close方法沒有任何意義
// 這兩個基於內存的流只要垃圾回收器清理對象就能夠釋放資源,這一點不同於對外部資源(如文件流)的釋放
} } |
下面是測試代碼:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 | import alizable; /**
* 人類
* @author 駱昊
*
*/ class Person implements Serializable {
private static final long serialVersionUID = -9102017020286042305L;
private String name; // 姓名
private int age; // 年齡
private Car car; // 座駕
public Person(String name, int age, Car car) {
this = name;
this = age;
this = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this = name;
}
public int getAge() {
return age;
}
public void setAge( int age) {
this = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]" ;
} } |
1234567891011121314151617181920212223242526272829303132333435363738 | /**
* 小汽車類
* @author 駱昊
*
*/ class Car implements Serializable {
private static final long serialVersionUID = -5713945027627603702L;
private String brand; // 品牌
private int maxSpeed; // 最高時速
public Car(String brand, int maxSpeed) {
this d = brand;
this peed = maxSpeed;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this d = brand;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed( int maxSpeed) {
this peed = maxSpeed;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]" ;
} } |
12345678910111213141516 | class CloneTest {
public static void main(String[] args) {
try {
Person p1 = new Person( "Hao LUO" , 33 , new Car( "Benz" , 300 ));
Person p2 = e(p1); // 深度克隆
ar()rand( "BYD" );
// 修改克隆的'Person對象p2關聯的汽車對象的品牌屬性
// 原來的Person對象p1關聯的汽車不會受到任何影響
// 因為在克隆Person對象時其關聯的汽車對象也被克隆了
tln(p1);
} catch (Exception e) {
tStackTrace();
}
} } |
注意:基於序列化和反序列化實現的克隆不僅僅是深度克隆,更重要的是通過泛型限定,可以檢查出要克隆的對象是否支持序列化,這項檢查是編譯器完成的,不是在運行時拋出異常,這種是方案明顯優於使用Object類的clone方法克隆對象。讓問題在編譯的時候暴露出來總是優於把問題留到運行時。
-
java的基礎語法教學
java的基礎語法教學前言學習完了第一個java程序,之後就來系統的學習java。先從基礎語法開始,這個語法你也可以理解為英語或是漢語裏面的語法,只不過大家各有各的特點和區別。學習編程其實也是一個編程語言的學習過程。我們在學習英語的.時候都説,要想學習好英語一...
-
計算機二級JAVA考試強化訓練題(單選)
為幫助考生們更快第掌握二級JAVA相應知識點,以下是本站小編搜索整理的一份計算機二級JAVA考試強化訓練題(單選),供參考練習,預祝考生們考出自己理想的成績!想了解更多相關信息請持續關注我們應屆畢業生考試網!單選題1).下列關於Applet的安全限制的敍述中,錯誤的是(...
-
java中反射機制
導語:Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++裏難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。下面我們來看看java中反射機制,希望對大家有所幫助。Java中什麼是反射機制:(JavaReflactioninaction)Java反射...
-
Java工程師是做什麼的
Java工程師職位描述提要:精通Java/J2EE編程,能熟練使用SpringMVC、hibernate、框架進行項目開發,熟練使用freemarker等前端模板語言。Java工程師職位描述:1、負責產品功能開發;2、遵循公司技術標準、規範,高質量完成設計、開發任務;3、參與研發部門技術積累、技術難題...