java幾種常見的創建對象的方法:
1、使用new關鍵字創建對象
2、利用java的反射機制,通過java.lang.Class或者java.lang.reflect.Constructor創建對象
3、實現Cloneable接口,然后重寫Object.clone()方法創建對象
4、實現序列化serialiable接口,通過反序列化,ObjectInputStream的readObject()方法創建對象
5、String str="abc" 直接由jvm創建 或者使用 字符串操作符"+" String str1 = "a"+"bc"由jvm創建
創建對象類TestBean.java
package test.createObj;import java.io.Serializable;public class TestBean implements Cloneable,Serializable{ /** * */ PRivate static final long serialVersionUID = -6896355094290356656L; private String id; private String name; public TestBean(String id, String name) { this.id = id; this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setId(String id) { this.id = id; } public String getId() { return id; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return super.toString()+" "+id+" "+name; }}
創建測試類CreateObjTest.java
package test.createObj;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Constructor;public class CreateObjTest { /** * @param args */ @SuppressWarnings("rawtypes") public static void main(String[] args) { //一、new關鍵詞新建一個對象 TestBean testbean1 = new TestBean("1","張三哈哈"); //二、反射機制 TestBean testbean2 = null; try { Class<?> clazz = Class.forName("test.createObj.TestBean"); //當類中含有參數的構造函數 而沒有無參構造函數時 會報java.lang.InstantiationException異常 //則類里需要添加無參構造函數// testbean2 = (TestBean) clazz.newInstance(); //或者用反射獲取類的有參構造函數 通過有參構造函數實例化對象 Class[] paramTypes = {String.class,String.class}; Constructor constor = clazz.getConstructor(paramTypes); testbean2 = (TestBean) constor.newInstance("2","李四"); } catch (Exception e) { e.printStackTrace(); } //三、克隆 但類必須要實現Cloneable接口 并且要在類里重寫clone方法 //jdl1.6中文api是這樣說的: //如果在沒有實現 Cloneable 接口的實例上調用 Object 的 clone 方法,則會導致拋出 CloneNotSupportedException 異常。 //按照慣例,實現此接口的類應該使用公共方法重寫 Object.clone(它是受保護的)。 //請參閱 Object.clone(),以獲得有關重寫此方法的詳細信息。 //注意,此接口不 包含 clone 方法。因此,因為某個對象實現了此接口就克隆它是不可能的。即使 clone 方法是反射性調用的,也無法保證它將獲得成功。 TestBean testbean3 = null; try { testbean3 = (TestBean) testbean1.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } //四、反序列化 但類要實現序列化接口 ObjectOutputStream objOutStream = null; ObjectInputStream objInStream = null; TestBean testbean4 = null; try { File file = new File("C://testbean.txt"); if(!file.exists()){ file.createNewFile(); }// objOutStream = new ObjectOutputStream(new FileOutputStream(file));// objOutStream.writeObject(testbean1); objInStream = new ObjectInputStream(new FileInputStream(file)); testbean4 = (TestBean) objInStream.readObject(); } catch (Exception e) { e.printStackTrace(); }finally{ if(objOutStream!=null){ try { objOutStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(objInStream!=null){ try { objInStream.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("testbean1:"+testbean1); System.out.println("testbean2:"+testbean2); System.out.println("testbean3:"+testbean3); System.out.println("testbean4:"+testbean4); }}
運行結果:
新聞熱點
疑難解答