使用new關(guān)鍵字創(chuàng)建對象
使用new關(guān)鍵字創(chuàng)建對象是最常見的一種方式,但是使用new創(chuàng)建對象會增加耦合度。在開發(fā)中應(yīng)該盡量減少new的使用以降低耦合度盗棵。
Object o=new SubObject();
o.sayHello();
使用反射機(jī)制創(chuàng)建對象
使用Class對象的newInstance方法,我們很容易就能夠創(chuàng)建出一個(gè)類的對象。
Class clz= Class.forName("com.wunian.object");
SubObject subObject =(SubObject ) clz.newInstance();
subObject.sayHello();
另外北滥,我們也可以使用Constructor類的newInstance方法來創(chuàng)建對象。
Class clz= Class.forName("com.wunian.object");
Constructor constructor = clz.getConstructor();
SubObject subObject =(SubObject) constructor.newInstance();
使用clone創(chuàng)建對象
clone對象時(shí)闸翅,需要已經(jīng)有一個(gè)分配了內(nèi)存的源對象再芋,創(chuàng)建新對象時(shí),首先應(yīng)該分配一個(gè)和源對象一樣大的內(nèi)存空間坚冀。要調(diào)用clone方法需要實(shí)現(xiàn)Cloneable接口济赎。
package com.wunian.object;
public class SubObject implements Cloneable{
public void sayHello(){
System.out.println("Hello world!");
}
public static void main(String[] args){
SubObject s= new SubObject();
try{
SubObject s2 = (SubObject)s.clone();
s2.sayHello();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
}
}
使用反序列化創(chuàng)建對象
使用序列化時(shí),要實(shí)現(xiàn)Serializable接口记某,將一個(gè)對象序列化到磁盤上司训,而采用反序列化可以將磁盤上的對象信息轉(zhuǎn)化到內(nèi)存中。
//實(shí)現(xiàn)Serializable序列化接口的類
package com.wunian.object;
import java.io.*;
public class SubObject implements Serializable{
public void sayHello(){
System.out.println("Hello world!");
}
}
//測試類
package com.wunian.test;
import java.io.*;
public class TestMain{
public static void main(String[] args){
SubObject s= new SubObject();
//準(zhǔn)備一個(gè)文件用于存儲該對象的信息
File f = new File("SubObject.txt");
try(FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis)
){
//序列化對象液南,寫入到磁盤中
oos.writeObject(s);
//反序列化對象
SubObject s2= (SubObject)ois.readObject();
//測試方法
s2.sayHello();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
}