java創建類的5種方式


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 }
運行類

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM