(翻译成中文:在com.aaa.test1.God类的线程中出现无序列化异常)
(extends是继承类,implements是实现接口。)java中 implement和extends的作用和区别详细解释https://blog.csdn.net/YouYou_GO/article/details/83539537
1.定义上帝类:
方法: 创建世界
2.要求使用懒汉,并且多线程安全的单例模式创建上帝类对象
3.接着针对创建的上帝类对象,使用深拷贝的方式,创建另外一个上帝对象
4.测试:
a.用单例模式获取两个上帝类对象,打印对象地址
b.用深拷贝方式获取两个对象,打印对象地址
package com.aaa.test1;
import java.io.*;
public class CopyUtil {
public static Object copyDeep(Object obj) throws IOException, ClassNotFoundException {
//定义 内存字节数组输出流:将字节数组输出到内存中的某个区域
ByteArrayOutputStream bos=new ByteArrayOutputStream();
//对象输出字节流:将数据对象写入到内存字节数组流中
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(obj);
//创造字节数组输入流:从上面的字节数组输出流中读取数据
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
return ois.readObject();
}
}
package com.aaa.test1;
import java.io.Serializable;
public class God implements Serializable {
//创造世界方法
public void create(){
System.out.println("创造世界");
}
//静态内部类
static class InnerCls{
//内部类中定义静态对象
static God god=new God();
}
//获取静态内部类中的对象
public static God getInstance(){
return InnerCls.god;
}
}
package com.aaa.test1;
import java.io.IOException;
public class GodCopy {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//原型对象
God g1=new God();
//通过字节数组流的方式,将对象数据写道内存中,然后再复制一份。实现深度copy
God g2=(God) CopyUtil.copyDeep(g1);
//调用方法
g1.create();
g2.create();
//输出对象
System.out.println(g1);
System.out.println(g2);
}
}