學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986 我們一起學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 測試...013 無參類的實例化4 測試...5 測試...016 測試...017 -------------------額外測試--------------------8 有參類的實例化9 測試...05
除了這幾種情況可以實例化一個Java類對象外,隱式調用實例化也是利用了已上集中情況。例如常見的方法:
1 public class ClassInstance{2 public ClassInstance(){3 }4 public ClassInstance getInstance(){5 return new ClassInstance();6 }7 }
通過觀察結果,我們發現無論哪一種方式必須經過的一步---調用構造方法。無論怎樣構造函數作為初始化類的意義怎樣都不會改變。
學習Java的同學注意了!??! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986 我們一起學Java!
新聞熱點
疑難解答