Java 實例化類的方法


  Java中,類的實例化方法有四種途徑:

1)使用new操作符

2)調用Class對象的newInstance()方法

3)調用clone()方法,對現有實例的拷貝

4)通過ObjectInputStream的readObject()方法反序列化類

1.ClassInstance.java

 1 import java.io.*;
 2 
 3 class ClassInstance implements Cloneable, Serializable {
 4     private String str = "測試...";
 5     public void fun(){
 6         System.out.println(str);
 7     }
 8     public ClassInstance(String str){
 9         System.out.println("有參類的實例化");
10         this.str += str; 
11     }
12     public ClassInstance(){
13         System.out.println("無參類的實例化");
14     }
15     public Object clone(){
16         return this;
17     }
18 }

2.ClassInstanceTest.java

 1 import java.io.*;
 2 import java.lang.reflect.*;
 3 
 4 public class ClassInstanceTest{
 5     public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
 6            IllegalAccessException, IOException,InvocationTargetException, NoSuchMethodException{
 7         //第一種類的實例化方式
 8         ClassInstance ci01 = new ClassInstance("01");
 9         ci01.fun();
10 
11         //第二種類的實例化方式
12         ClassInstance ci02 = (ClassInstance) Class.forName("ClassInstance").newInstance();
13         ci02.fun();
14 
15         //第三種類的實例化方式
16         ClassInstance ci03 = (ClassInstance) ci01.clone();
17         ci03.fun();
18 
19         //第四種類的實例化方式
20         FileOutputStream fos = new FileOutputStream("ci.tmp");
21         ObjectOutputStream oos = new ObjectOutputStream(fos);
22         oos.writeObject(ci01);
23         oos.close();
24         fos.close();
25         
26         FileInputStream fis = new FileInputStream("ci.tmp");
27         ObjectInputStream ois = new ObjectInputStream(fis);
28         
29         ClassInstance ci04  = (ClassInstance) ois.readObject();
30         ois.close();
31         fis.close();
32         
33         ci04.fun();
34         System.out.println("--------------------額外測試--------------------");
35         ClassInstance ci05 = null;
36         //額外的思考 在第二種類實例化的方式中有沒有一種方法實現有參數的構造方式
37         //獲得類的構造信息
38         Constructor[] ctor = Class.forName("ClassInstance").getDeclaredConstructors();
39         //找到我們需要的構造方法
40         for(int i=0;i<ctor.length;i++ ){
41             Class[] cl = ctor[i].getParameterTypes();
42             if(cl.length == 1){
43                 //實例化對象
44                 ci05 = (ClassInstance) Class.forName("ClassInstance").getConstructor(cl).newInstance(new Object[]{"05"});
45             }
46         }
47         ci05.fun();
48     }
49 }

 

 

3.輸出結果

1 有參類的實例化
2 測試...01
3 無參類的實例化
4 測試...
5 測試...01
6 測試...01
7 -------------------額外測試--------------------
8 有參類的實例化
9 測試...05

 

  除了這幾種情況可以實例化一個Java類對象外,隱式調用實例化也是利用了已上集中情況。例如常見的方法:

1 public class ClassInstance{
2   public ClassInstance(){
3   }
4     public ClassInstance getInstance(){
5     return new ClassInstance();
6   }
7 }

  

  通過觀察結果,我們發現無論哪一種方式必須經過的一步---調用構造方法。無論怎樣構造函數作為初始化類的意義怎樣都不會改變。

 

 

 

 


免責聲明!

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



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