实例化对象的几种方式

  1. new
  2. 克隆(对象需实现Cloneable接口,并重写clone方法)
  3. 反射机制创建
  4. 反序列化创建

     //new 对象
     User newUser = new User();
     System.out.println("------------new-----");
     newUser.setName("new的用户");
     System.out.println(newUser);
     User cloneUser = (User)newUser.clone();
     cloneUser.setName("克隆的user");
     System.out.println("------------clone-----");
     System.out.println(cloneUser);
     //通过反射机制创建
     Class<?> user = Class.forName("com.example.exercise.test.InstanceObj.User");
     User user1 = (User)user.newInstance();
     user1.setName("反射创建的用户");
     System.out.println("------------invoke-----");
     System.out.println(user1);
     //将一个对象实例化后,进行序列化,再反序列化,也可以获得一个对象(远程通信的场景下使用)
         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:/testData.txt"));
         User user2 = new User("序列化", "18");
         //序列化对象
         out.writeObject(user2);
         out.close();
         //反序列化对象
         ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/testData.txt"));
         User user3 = (User)in.readObject();
         System.out.println("反序列化user:" + user3);

    浅克隆(ShallowClone) 深克隆

     在浅克隆中,如果源对象的成员变量是值类型,将复制一份给克隆对象;如果源对象的成员变量是引用类型,则将引用对象的地址复制一份给目标对象,也就是说源对象和目标对象的成员变量指向相同的内存地址。简言之,浅克隆,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
      在深克隆中,无论源对象的成员变量是值类型还是引用类型,都将复制一份给目标对象,深克隆将源对象的所有引用对象也复制一份给目标对象。简言之,深克隆,除了对象本身被复制外,对象所包含的所有成员变量也将复制。
    

总结

实现对象克隆有两种方式:
1️实现 Cloneable 接口并重写 Object 类中的 clone()。
2️实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
3️注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种方案明显优于使用 Object 类的 clone 方法克隆对象。让问题在编译时暴露出来总是优于把问题留到运行时。

AHF_BL
1 声望0 粉丝

« 上一篇
java设计模式