首先,这里说明” 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; } }
同样的道理,克隆后的两个对象为两个不同的对象哦...
好吧,今天就先到这里吧~~~
原文:http://www.cnblogs.com/xiohao/p/4351922.html