標籤:The 名稱 instant 反序 uid prot over sys cti
java對象執行個體化的方式有以下幾種:
1、使用new
2、原廠模式
3、反射
4、clone()方法
5、還原序列化方式
/**
- 實現Cloneable和Serializable介面
*/
public class Book implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private Integer serialNum; // 序號
private String name; // 圖書名稱
public Book() {
System.out.println("預設建構函式");
}
public Book(Integer serialNum, String name) {
System.out.println("帶參數建構函式");
this.serialNum = serialNum;
this.name = name;
}
public int getSerialNum() {
return serialNum;
}
public void setSerialNum(int serialNum) {
this.serialNum = serialNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
if (name == null) {
return "書籍屬性還未填寫";
}
return serialNum + " : " + name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class BookFactory {
public static Book getInstance(Integer serialNum, String name) {
return new Book(serialNum, name);
}
}
public class Instantiation {
// 1.通過new執行個體化對象public static Book newMode() { System.out.println("============================================================"); System.out.println("通過new執行個體化對象"); Book book = new Book(1, "大道揚帆"); return book;}// 2.通過工廠方式執行個體化對象,其本質還是new,但將執行個體化的細節交給了工廠來處理,屏蔽了和業務代碼無關的功能,一定程度上實現了和業務代碼的解耦public static Book factoryMode() { System.out.println("============================================================"); System.out.println("通過工廠方式執行個體化對象"); return BookFactory.getInstance(2, "大道揚帆");}// 3.通過反射方式執行個體化對象@SuppressWarnings("rawtypes")public static Book reflectMode() throws Exception { System.out.println("============================================================"); System.out.println("通過反射方式執行個體化對象"); Class[] parameterTypes = new Class[] {Integer.class, String.class}; Constructor constructor = Book.class.getConstructor(parameterTypes); Book book = (Book) constructor.newInstance(3, "大道揚帆"); return book;}// 3-1.通過反射方式執行個體化對象還有一種方式,但本質上其實和上面的一樣,但需要類本身有無參建構函式public static Book reflectAnotherMode() throws Exception { System.out.println("============================================================"); System.out.println("通過反射方式執行個體化對象的另外一種方式"); Book book = (Book) Class.forName("instantiation.Book").newInstance(); return book;}// 4.調用已存在對象的clone()方法執行個體化對象public static Book cloneMode(Book book) throws Exception { System.out.println("============================================================"); System.out.println("調用已存在對象的clone()方法執行個體化對象"); Book newBook = (Book) book.clone(); System.out.println("原對象和複製對象是同一個對象嗎?" + (book == newBook)); return newBook;}// 5.對象序列化後可以通過還原序列化建立對象public static Book unSerializedMode() throws Exception { System.out.println("============================================================"); System.out.println("對象序列化後可以通過還原序列化建立對象"); Book book = new Book(5, "大道揚帆"); ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("D:/book.obj"))); objectOutputStream.writeObject(book); ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("D:/book.obj"))); Book newBook = (Book) objectInputStream.readObject(); System.out.println("原對象和還原序列化的對象是同一個嗎?" + (book == newBook)); return newBook;}public static void main(String[] args) throws Exception { System.out.println(Instantiation.newMode()); System.out.println(Instantiation.factoryMode()); System.out.println(Instantiation.reflectMode()); System.out.println(Instantiation.reflectAnotherMode()); Book book = new Book(4, "大道揚帆"); System.out.println(Instantiation.cloneMode(book)); System.out.println(Instantiation.unSerializedMode());}
}
看精彩玄幻世界,盡在《大道揚帆》https://book.qidian.com/info/1012993779
java對象執行個體化的方式