java创建对象的四种方式

299 阅读2分钟

先给定一个类:

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赋值