龙空技术网

面试题Java对象创建的几种方式对比总结,非常详细的总结

程序员左手代码右手诗 124

前言:

现时你们对“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复制类对象值