乐趣区

关于后端:基础整理

实例化对象的几种形式

  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 办法克隆对象。让问题在编译时裸露进去总是优于把问题留到运行时。
退出移动版