先给定一个类:
public class dog {
private String name;
private int age;
public dog() {
}
public dog(String name, int age) {
this.name = name;
this.age = age;
}
//getter setter toString
}
第一种:通过new创建对象
//1.通过new创建对象
dog d1 = new dog("泰迪",2);
第二种:通过反射创建字节码对象在newInstance()创建实例
dog d2 = dog.class.newInstance();
第三种:通过实现Clonable接口,利用clone()来创建对象
public class dog implements Cloneable{
private String name;
private int age;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
注意:通过obj.clone()创建的对象,会在内存中重新开辟一块空间
dog d1 = new dog("泰迪",2);
dog d3 = (dog) d1.clone();
system.out.println(d1==d3); //false
第四种:通过实现Serialize接口,序列化与反序列化实现创建对象 实现Serializeable接口
public class dog implements Serializable{
private String name;
private int age;
//.........
}
在通过序列化和反序列化创建对象
public class test_1 {
public static void main(String[] args) throws Exception {
//序列化
serilizDog();
//反序列化
dog d = deserilizDog();
System.out.println(d.toString());
}
/*
序列化
*/
public static void serilizDog() throws IOException {
dog d = new dog();
d.setName("小狗");
d.setAge(2);
//ObjectOutputStream:对象流,将pig对象存储在磁盘中
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("D:/dog.txt")));
oos.writeObject(d);
System.out.println("对象序列化成功");
oos.close();
}
/*
反序列化
*/
public static dog deserilizDog() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/dog.txt"));
dog d = (dog) ois.readObject();
System.out.println("对象反序列化成功");
return d;
}
}
关于序列化,反序列化也是面试中必备的一个知识点
- 谈一谈什么是序列化机制?
序列化就是把对象转为字节序列的这么一个过程,反序列化就是反过来。
- 为什么要序列化?
持久存储时:需要将对象存储在硬盘上
网络传输时:两个进程进行远程通信时,发送方将Java对象序列化,接收方在反序列化回来。
当我修改不加序列化ID,但加了一个新属性color时
public class dog implements Serializable{
private String name;
private int age;
//private static final long serialVersionUID = 1L;
private String color;
//......
}
此时直接进行反序列化会报错找不到,因为会重新计算一边该对象的serialVerionUID,所以一定要给这个serivalVersionUID赋值