前言
學習的過程,遇到很多情況需要通過非“new”的方式創建對象。
第一種(new)
public class Test { @Override public String toString() { return "===== Test ====="; } }
public class TestDemo { public static void main(String[] args) { Test test = new Test(); // 創建對象 test.toString(); } }
第二種(class.newInstance)
public class TestDemo { public static void main(String[] args) { Test test = null; try { test = (Test) Class.forName("demo.knowledgepoints.createobject.Test").newInstance(); // 創建對象 } catch (Exception e) { e.printStackTrace(); } System.out.println(test.toString()); } }
第三種(Constructor.newInstance)
public class Test { public Test(String str){ System.out.println(str); } @Override public String toString() { return "===== Test ====="; } }
public class TestDemo { public static void main(String[] args) { try { Constructor<Test> constructor = Test.class.getConstructor(String.class); Test test = constructor.newInstance("通過構造有參構造函數創建對象"); System.out.println(test.toString()); } catch (Exception e) { e.printStackTrace(); } } }
運行結果:
第四種(clone)
需要實現Cloneable接口
public class Test implements Cloneable { @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "===== Test ====="; } }
public class TestDemo { public static void main(String[] args) { Test test = new Test(); try { Test test1 = (Test)test.clone(); System.out.println(test1.toString()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }
運行結果:
第五種(反序列化)
public class Test implements Serializable { private static final long serialVersionUID = 1L; @Override public String toString() { return "===== Test ====="; } }
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class TestDemo { public static void main(String[] args) { try { Test test = new Test(); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("demo.knowledgepoints.createobject.obj")); out.writeObject(test); out.close(); ObjectInputStream in = new ObjectInputStream(new FileInputStream("demo.knowledgepoints.createobject.obj")); Test test1 = (Test) in.readObject(); System.out.println(test1.toString()); in.close(); } catch (Exception e) { e.printStackTrace(); } } }
運行結果:
序列化和反序列化詳情參考:https://www.cnblogs.com/jssj/p/11766027.html
總結
不同的創建對象有不同的應用場景,瞭解這些場景對閱讀源碼很有幫助。