首先,這里說明” 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;
}
}
同樣的道理,克隆后的兩個對象為兩個不同的對象哦...
好吧,今天就先到這里吧~~~
