当前位置:   article > 正文

【Java基础】Java对象创建的几种方式_clone 方法创建对象

clone 方法创建对象

先上关键内容,所用到的代码请参考文末示例代码。

一、使用new关键字创建对象

这是一种最常用的创建对象的方式。

Student student1 = new Student();

二、使用Class的newInstance()方法创建对象

需要有一个无参构造方法,这个newInstance()方法调用无参的构造函数创建对象。

类名.calss.newInstance( )

Student student2 = Student.class.newInstance();

该方法就是反射机制,事实上Class的newInstance()方法内部就是调用Constructor的newInstance()方法。

Class类的newInstance只能触发无参构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象。

三、使用Constructor类的newInstance()方法创建对象

java.lang.reflect.Constructor类里也有一个newInstance()方法可以创建对象。我们可以通过这个newInstance()方法调用有参数的和私有的构造函数。

Constructor student3 = Constructor.class.newInstance();

四、使用克隆clone()方法创建对象

Tips:要使用clone()方法,我们需要先实现Cloneable接口并实现其定义的clone()方法

无论何时我们调用一个对象的clone()方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone()方法创建对象并不会调用任何构造函数。

Student student4 = new Student().clone();

五、使用反序列化创建对象

Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;

使用反序列化:当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。

为了反序列化一个对象,我们需要让我们的类实现Serializable接口。

  1. ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME));
  2. // 5、使用反序列化创建对象
  3. Object student5 = ois.readObject();

六、创建对象的5种方式调用构造器总结

创建对象的方式

是否调用了构造器

使用new关键字创建对象

Class.newInstance()

Constructor.newInstance()

clone()

反序列化

Java创建实例对象是不是必须要通过构造函数?这其实是衍生出来的一个面试题。 上面问题的答案很明显了:Java创建实例对象,并不一定必须要调用构造器的。

七、示例代码(全)

以下是本文所用到的所有示例代码。

7.1 编写Student学生类

  1. package com.effective.chapter2.other;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.io.Serializable;
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class Student implements Cloneable, Serializable {
  10. private String name;
  11. private Integer age;
  12. @Override
  13. public Student clone() {
  14. try {
  15. Student clone = (Student) super.clone();
  16. // TODO: copy mutable state here, so the clone can't change the internals of the original
  17. return clone;
  18. } catch (CloneNotSupportedException e) {
  19. throw new AssertionError();
  20. }
  21. }
  22. }

7.2 编写测试类

  1. package com.effective.chapter2.other;
  2. import java.io.*;
  3. import java.lang.reflect.Constructor;
  4. public class CreateObjectTest {
  5. private static final String FILE_NAME = "student.obj";
  6. public static void main(String[] args) throws InstantiationException, IllegalAccessException, IOException {
  7. // 1、使用new关键字创建对象
  8. Student student1 = new Student();
  9. System.out.println("使用new关键字创建对象:" + student1);
  10. // 2、使用Class类的newInstance()方法创建对象
  11. Student student2 = Student.class.newInstance();
  12. System.out.println("使用Class类的newInstance()方法创建对象:" + student2);
  13. // 3、使用Constructor类的newInstance()方法创建对象
  14. Constructor student3 = Constructor.class.newInstance();
  15. System.out.println("使用Constructor类的newInstance()方法创建对象:" + student3);
  16. // 4、使用clone()方法创建对象
  17. Student student4 = student2.clone();
  18. System.out.println("使用clone()方法创建对象:" + student4);
  19. try {
  20. // Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;
  21. // 序列化对象
  22. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME));
  23. oos.writeObject(student1);
  24. ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME));
  25. // 5、使用反序列化创建对象
  26. Object student5 = ois.readObject();
  27. System.out.println("使用反序列化创建对象:" + student5);
  28. } catch (ClassNotFoundException e) {
  29. throw new RuntimeException(e);
  30. }
  31. }
  32. }

完结!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/813254
推荐阅读
相关标签
  

闽ICP备14008679号