(9)Java中,你知道几种对象的创建方式?

本文介绍了在Java中创建对象的五种不同方法:使用new关键字,通过反射调用构造方法,实现Cloneable接口进行克隆,利用反序列化以及使用MethodHandleAPI。每种方法都有其特定的应用场景,如new关键字是最常见的构造方式,而克隆和反序列化则不调用构造方法。
摘要由CSDN通过智能技术生成

在Java中,创建对象的几种方式包括:

  1. 使用new关键字创建对象

  2. 反射调用

  3. 克隆(clone)浅克隆

  4. 反序列化

  5. MethodHand API

  6. Unsafe 工具创建

其中,第一种方式是最常见的创建对象的方式,而其他方式则更多地用于一些特殊的场合。

具体使用方式如下:

给定一个类:

public class Teacher implements Cloneable, Serializable {
​
    private Integer id;
    private String name;
    private Integer age;
​
    public Teacher(Integer id, String name, Integer age) {
        System.out.println("Teacher ... 构造");
        this.id = id;
        this.name = name;
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
​
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
​

1、使用 new 关键字:会使用构造方法

 Teacher teacher1 = new Teacher(1, "张三", 25);
 System.out.println("teacher1 = " + teacher1);

2、反射调用:会调用构造方法

  
      Constructor<Teacher> constructor = Teacher.class
                .getDeclaredConstructor(Integer.class,
                        String.class,
                        Integer.class);
​
        Teacher teacher2 = constructor.newInstance(10, "李四", 26);
        System.out.println("teacher2 = " + teacher2);

3、克隆:不会调用构造方法,需要实现 Cloneable 接口,并重写 clone 方法

      
  Teacher teacher3 = (Teacher) teacher1.clone();
  System.out.println("teacher3 = " + teacher3);
  System.out.println(" teacher1 == teacher3 --->" + (teacher1 == teacher3));
​

4、使用反序列化:不会调用构造方法,需要实现 Serializable 接口

      
  //使用序列化
        byte[] bytes = serialize(teacher1);
        Teacher teacher4 = (Teacher) deserialize(bytes);
        System.out.println("teacher4 = " + teacher4);
        System.out.println("teacher1 == teacher4  --->" + (teacher1 == teacher4));
​
​
​
    /**
     * 序列化
     *
     * @param teacher
     * @return
     * @throws IOException
     */
    private static byte[] serialize(Teacher teacher) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(teacher);
        byte[] bytes = bos.toByteArray();
        return bytes;
​
    }
​
    /**
     * 反序列化
     *
     * @param bytes
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    private static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
        ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
        return inputStream.readObject();
    }

5、MethodHandle API:会调用构造方法

// MethodHandle API
​
MethodHandle handle = MethodHandles.lookup().findConstructor(Teacher.class, MethodType.methodType(void.class, Integer.class, String.class, Integer.class));
Teacher teacher5 = (Teacher) handle.invoke(23, "小美", 18);
System.out.println("teacher5 = " + teacher5);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值