实例化对象的几种形式
- new
- 克隆(对象需实现 Cloneable 接口,并重写 clone 办法)
- 反射机制创立
-
反序列化创立
//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 办法克隆对象。让问题在编译时裸露进去总是优于把问题留到运行时。