前言:
现时你们对“java复制类对象值”大约比较看重,兄弟们都需要学习一些“java复制类对象值”的相关文章。那么小编在网上搜集了一些关于“java复制类对象值””的相关资讯,希望大家能喜欢,大家一起来学习一下吧!本章节讲一下场景对象几种方式,主要有new 、反射、克隆、反序列化
new
这种方式是最常见的,通过调用构造方法创建对象,比如new String("hello"),这种方式一定知道具体要创建的类型,比如要创建String,就new String(); 并且不能是接口、抽象类。有人说不对呀,下面方式可以new 接口或者抽象类呀,其实这叫匿名类。在许多情况下,我们是不知道对象的具体类型的,如泛型 和 通用中间件
new Comparable<Integer>(){ @Override public int compareTo(Integer o) { return 0; } };
public class GenericBean <T>{ public T newInstance(){ // 编译报错 return new T(); } }反射
调用Class.newInstance() 创建对象,这种方式一些框架很常见,如spring ,在spring boot 还 没有流行之前,使用xml配置的方式,相信不会忘记经常需要配置某个类的全路径。
这种方式有个限制必须要有默认的无参构造方法, 下面类代码会抛异常 NoSuchMethodException: com.happycao.study.object.Student.<init>(),那些添加了带参数的构造方法,而没有提供无参的构造方法同学注意了。
public class Student { private String name ; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public static void main(String[] args) { Class<Student> clazz = Student.class; try { clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } }}
克隆
克隆需要实现Cloneable接口(可以试下没有实现会抛异常),克隆对象与原对象不是同一个对象,克隆有浅拷贝、和深拷贝
浅拷贝修改对象属性会影响原对象
深拷贝则不会, 深拷贝实现方式记住口诀,属性也进行clone 。
这里只贴下深拷贝代码
public class CloneBean implements Cloneable { private int[] arr; public CloneBean( int[] arr) { this.arr = arr; } public void setArr(int[] arr) { this.arr = arr; } @Override protected CloneBean clone() throws CloneNotSupportedException { CloneBean cloneBean = (CloneBean)super.clone(); cloneBean.setArr(arr.clone()); return cloneBean; } @Override public String toString() { return "CloneBean{" + ", arr=" + Arrays.toString(arr) + '}'; } public static void main(String[] args) throws CloneNotSupportedException { int arr[] = new int[]{1,2,3}; CloneBean cloneBean1 = new CloneBean(arr); CloneBean cloneBean2 = cloneBean1.clone(); System.out.println(cloneBean2 == cloneBean1); System.out.println("cloneBean1" + cloneBean1); System.out.println("cloneBean2" + cloneBean2); arr[1] = 1000; System.out.println("cloneBean1" + cloneBean1); System.out.println("cloneBean2" + cloneBean2); }}反序列化
对象序列化需要实现Serializable接口,序列化是 ObjectOutputStream.writeObject() 反序列化ObjectInputStream.writeObject 。在网络传输中比较常见,笔者在大学一个大作业网络白板中第一次接触
public class ExampleBean implements Serializable { private String name ; public ExampleBean(String name) { this.name = name; } @Override public String toString() { return "ExampleBean{" + "name='" + name + '\'' + '}'; } public static void main(String[] args) throws IOException, ClassNotFoundException { ExampleBean exampleBean = new ExampleBean("hello"); ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(exampleBean); out.close(); ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteOut.toByteArray())); ExampleBean exampleBean2 = (ExampleBean)in.readObject(); in.close(); System.out.println(exampleBean2); }}
还有没有其他创建对象的方式,欢迎交流
标签: #java复制类对象值