標籤:
首先,這裡說明” Java中是構造器建立對象 “這句話是完全錯誤的。
Java中構造器的作用主要是為了初始設定變數的值...其實在執行構造器之前,Java對象所需要的記憶體空間,已經產生了...
一般可以理解為由new關鍵字建立出來的哦。
在某些時候,一般通過new 關鍵字建立出相應的對象後,可以通過對應的構造方法來初始化對應變數的值。
但在某些特殊情況下,我們可以不通過new關鍵字而建立出相關的對象
常見的兩種不通過new 關鍵字建立對象的方式如下:
1)通過Java的序列化和還原序列化,來建立相關的對象...
2)通過Java的clone來建立相關的對象...
下面將分別講解建立對象的這兩種方式:
1)通過Java序列化的方式來建立Java對象
具體例子如下:
package com.yonyou.test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 測試類別 * @author 小浩 * @建立日期 2015-3-2 */public class Test{ public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { Wolf wolf_old=new Wolf(); Wolf wolf_new=null; //建立對象輸出資料流 ObjectOutputStream outStream=new ObjectOutputStream(new FileOutputStream("a.txt")); ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream("a.txt")); outStream.writeObject(wolf_old); wolf_new=(Wolf) inputStream.readObject(); System.out.println(Wolf.count); System.out.println("wolf_old和wolf_new相等嗎?"+(wolf_old==wolf_new)); } }/** * 建立狼這個測試對象 * @author 小浩 * @建立日期 2015-3-19 */class Wolf implements Serializable{private static final long serialVersionUID = 1L;static int count=100;public Wolf(){count-=10;System.out.println("您好,我們正在執行構造方法...");System.out.println(count);}}
需要注意的是在使用java的序列化和還原序列化的時候要使對應的實體類實現Serializable序列化介面哦...
同時需要注意的是通過IO流實現還原序列化的過程建立的對象的內容與原對象時完全一致的,但是它們卻是不同的對象...
同時通過序列化和還原序列化建立的對象不會調用原來對象的構造方法...
同時也提醒了我們,其實我們可以通過“ 私人的構造方法來實現單例模式 ”這種方式有可能是不安全的(為什麼呢?)...
如果要想在還原序列化的過程中不會產生多個java對象執行個體,則應該為單例類提供readResolve()方法,該方法保證
在還原序列化的過程中得到已有的java執行個體...
具體例子如下:
package com.yonyou.test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 測試類別 * @author 小浩 * @建立日期 2015-3-2 */public class Test{ public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { Wolf wolf_old=Wolf.getWolf(); Wolf wolf_new=null; //建立對象輸出資料流 ObjectOutputStream outStream=new ObjectOutputStream(new FileOutputStream("a.txt")); ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream("a.txt")); outStream.writeObject(wolf_old); wolf_new=(Wolf) inputStream.readObject(); System.out.println(Wolf.count); System.out.println("wolf_old和wolf_new相等嗎?"+(wolf_old==wolf_new)); } }/** * 建立狼這個測試對象 * @author 小浩 * @建立日期 2015-3-19 */class Wolf implements Serializable{private static final long serialVersionUID = 1L; static int count=100;static Wolf wolf=null;private Wolf(){count-=10;System.out.println("您好,我們正在執行構造方法...");System.out.println(count);}public static Wolf getWolf(){if(wolf==null){wolf=new Wolf();}return wolf;}/** * 在還原序列化的過程為實現單一執行個體而構建的方法 */private Object readResolve(){return wolf;}}
2)通過Java的clone來建立相關的對象...
首選被複製的對象需要實現複製介面:Clonable
其次被複製的對象需要重寫clone方法
具體例子如下:
package com.yonyou.test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 測試類別 * @author 小浩 * @建立日期 2015-3-2 */public class Test{ public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { Wolf wolf_old=new Wolf(); //複製相應的對象,並將其賦給新的對象 Wolf wolf_new=(Wolf) wolf_old.clone(); System.out.println(Wolf.count); System.out.println("wolf_old和wolf_new相等嗎?"+(wolf_old==wolf_new)); } }/** * 建立狼這個測試對象 * @author 小浩 * @建立日期 2015-3-19 */class Wolf implements Cloneable{static int count=100;static Wolf wolf=null;public Wolf(){count-=10;System.out.println("您好,我們正在執行構造方法...");System.out.println(count);}/** * 實現複製介面的時候需要重寫的方法,但不是必須的 */public Object clone(){Wolf wolf=null;try {wolf=(Wolf) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return wolf;}}
同樣的道理,複製後的兩個對象為兩個不同的對象哦...
好吧,今天就先到這裡吧~~~
Java中是構造器建立對象嗎?