实例化对象的几种方式new克隆(对象需要实现Cloneable接口并重写clone方法)反射机制创建和反序列化创建//newobjectUsernewUser=newUser();系统输出。println("------------新-----");newUser.setName("新用户");System.out.println(newUser);用户cloneUser=(User)newUser.clone();cloneUser.setName("克隆用户");System.out.println("------------克隆-----");System.out.println(克隆用户);//通过反射机制创建Class>user=Class.forName("com.example.exercise.test.InstanceObj.User");用户user1=(User)user.newInstance();user1.setName("反射创建的用户");System.out.println("------------调用-----");System.out.println(user1);//将一个对象实例化后,序列化再反序列化,也可以得到一个对象(用于远程通信场景)ObjectOutputStreamout=newObjectOutputStream(newFileOutputStream("D:/testData.txt"));Useruser2=newUser("连载","18");//序列化对象out.writeObject(user2);关闭();//反序列化对象ObjectInputStreamin=newObjectInputStream(newFileInputStream("D:/testData.txt"));用户user3=(User)in.readObject();System.out.println("反序列化用户:"+user3);ShallowClone深度克隆浅克隆中,如果源对象的成员变量是值类型,则对克隆对象进行复制;如果源对象的成员变量是引用类型,那么被引用对象的地址会被复制到目标对象中,也就是说源对象和目标对象的成员变量指向同一个内存地址简而言之,浅克隆,在复制对象时,只复制自身和包含在其中的值类型的成员变量,而不会复制引用类型的成员对象。在深度克隆中,无论源对象的成员变量是值类型还是引用类型,都会被复制到目标对象中,同时深度克隆也会将源对象的所有引用对象复制到目标对象中。简而言之,深度克隆,除了复制对象本身外,对象中包含的所有成员变量也会被复制。总结对象克隆的实现方式有两种:1??实现Cloneable接口,重写Object类中的clone()。2?实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。3?注意:基于序列化和反序列化的克隆不仅仅是深度克隆,更重要的是通过泛型限制,可以检查被克隆的对象是否支持序列化。这种检查是由编译器完成的,而不是在运行时抛出异常,这明显优于使用Object类的clone方法克隆对象。在编译时暴露问题总是比在运行时留下问题更好。
