A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡宝林 中级黑马   /  2012-6-4 11:34  /  1147 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单例其实并不是得到的单例类的对象都是同一个对象,下面我通过几个例子给大家演示一下
//单例
public class F extends Exception{
    private F(){}
    public static final F f=new F();
}
//通过反射的方法创建另外一个单例对象
import java.lang.reflect.Constructor;
public class G {
public static void main(String[] args) throws Exception{
  F f= F.f;
Class c= F.class;
Constructor co= c.getDeclaredConstructor(null);
co.setAccessible(true);
F ff= (F) co.newInstance(null);
System.out.println(f==ff);     //这里打印false,证明f和ff不是同一个对象
}
}
//利用隐藏的构造器创建另一个单例对象
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class H {
  public static void main(String[] args) {
F f=F.f;
F ff= (F) copy(f);
System.out.println(f==ff);
}
   public static Object copy(Object obj){
      try{
          ByteArrayOutputStream bos =
              new ByteArrayOutputStream();
         new ObjectOutputStream(bos).writeObject(obj);
          ByteArrayInputStream bin =
              new ByteArrayInputStream(bos.toByteArray());
          return new ObjectInputStream(bin).readObject();
      } catch(Exception e) {
          throw new IllegalArgumentException(e);
      }
  }
//F继承了Exception,而Exception实现了java.io.Serializable。这就意味着F是可序列化的(serializable),并且解序列(deserialization)会创建一个隐藏的构造器
//用这个隐藏的构造器就会创建另外一个单例类F的对象,可以看到打印的结果是false,也就是f和ff不是同一个对象

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马