1、使用new關鍵字 } → 調用了構造函數
這種方式,我們可以調用任意的構造函數(無參的和帶參數的)。
2、使用Class類的newInstance方法 } → 調用了構造函數
使用Class類的newInstance方法創建對象。這個newInstance方法調用無參的構造函數創建對象。
3、使用Constructor類的newInstance方法 } → 調用了構造函數
和Class類的newInstance方法很像, java.lang.reflect.Constructor類里也有一個newInstance方法可以創建對象。我們可以通過這個newInstance方法調用有參數的和私有的構造函數。
4、使用clone方法 } → 沒有調用構造函數
無論何時我們調用一個對象的clone方法,jvm就會創建一個新的對象,將前面對象的內容全部拷貝進去。用clone方法創建對象並不會調用任何構造函數。
要使用clone方法,我們需要先實現Cloneable接口並實現其定義的clone方法。
5、使用反序列化 } → 沒有調用構造函數
當我們序列化和反序列化一個對象,jvm會給我們創建一個單獨的對象。在反序列化時,jvm創建對象並不會調用任何構造函數。
為了反序列化一個對象,我們需要讓我們的類實現Serializable接口
代碼demo

1 package javatest.demo; 2 3 import java.io.Serializable; 4 5 public class PrintTest implements Cloneable, Serializable { 6 7 public static final long serivalVersion = 1L; 8 9 private String name; 10 11 public PrintTest() { 12 System.out.println("this is Constructor"); 13 } 14 15 public void hello() { 16 System.out.println("hello "); 17 } 18 19 @Override 20 public int hashCode() { 21 final int prime = 31; 22 int result = 1; 23 result = prime * result + ((name == null) ? 0 : name.hashCode()); 24 return result; 25 } 26 27 @Override 28 public boolean equals(Object obj) { 29 if (this == obj) 30 return true; 31 if (obj == null) 32 return false; 33 if (getClass() != obj.getClass()) 34 return false; 35 PrintTest other = (PrintTest) obj; 36 if (name == null) { 37 if (other.name != null) 38 return false; 39 } else if (!name.equals(other.name)) 40 return false; 41 return true; 42 } 43 44 @Override 45 public String toString() { 46 return "PrintTest [name=" + name + "]"; 47 } 48 49 @Override 50 protected Object clone() throws CloneNotSupportedException { 51 // TODO Auto-generated method stub 52 return super.clone(); 53 } 54 55 public String getName() { 56 return name; 57 } 58 59 public void setName(String name) { 60 this.name = name; 61 } 62 63 }

1 package javatest.demo; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.ObjectInputStream; 6 import java.io.ObjectOutputStream; 7 import java.lang.reflect.Constructor; 8 9 /** 10 * 創建一個類的幾種方法? 11 * 12 * @author BrokenColor 13 * @date 2018年6月7日 14 */ 15 public class InstanceDemo { 16 17 public static void main(String[] args) { 18 19 // 使用new關鍵字} → 調用了構造函數 20 System.out.println("=================new關鍵字:"); 21 PrintTest printtest1 = new PrintTest(); 22 printtest1.setName("printtest1"); 23 System.out.println(printtest1 + ",hashcode:" + printtest1.hashCode()); 24 printtest1.hello(); 25 try { 26 // 使用Class類的newInstance方法} → 調用了構造函數 27 System.out.println("=========Class類的newInstance方法:"); 28 PrintTest printtest2 = (PrintTest) Class.forName("javatest.demo.PrintTest").newInstance(); 29 //或者可以 30 // PringtTest pringttest2 = PringtTest.class.newInstance(); 31 printtest2.setName("printtest2"); 32 System.out.println(printtest2 + ",hashcode:" + printtest2.hashCode()); 33 printtest2.hello(); 34 35 // 使用Constructor類的newInstance方法 } → 調用了構造函數 36 System.out.println("=======Constructor類的newInstance方法:"); 37 Constructor<PrintTest> constructor = PrintTest.class.getConstructor(); 38 PrintTest printTest3 = (PrintTest) constructor.newInstance(); 39 printTest3.setName("printTest3"); 40 System.out.println(printTest3 + ",hashcode:" + printTest3.hashCode()); 41 printTest3.hello(); 42 43 // 使用clone方法 } → 沒有調用構造函數 44 System.out.println("=======使用clone方法 } → 沒有調用構造函數"); 45 PrintTest printTest4 = (PrintTest) printTest3.clone(); 46 printTest4.setName("printTest4"); 47 System.out.println(printTest4+",hashcode:"+printTest4.hashCode()); 48 49 //序列化 50 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj")); 51 out.writeObject(printTest4); 52 out.close(); 53 54 // 使用反序列化 } → 沒有調用構造函數 55 System.out.println("===========使用反序列化"); 56 ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj")); 57 PrintTest printTest5 = (PrintTest) in.readObject(); 58 printTest5.setName("printTest5"); 59 System.out.println(printTest5+",hashcode:"+printTest5.hashCode()); 60 printTest5.hello(); 61 62 } catch (Exception e) { 63 // TODO Auto-generated catch block 64 e.printStackTrace(); 65 } 66 67 } 68 69 }
運行結果: