Java对象创建的几种方式总结,
Java对象创建的几种方式总结,
目录
- 一、使用new关键字创建对象
- 二、使用Class的newInstance()方法创建对象
- 三、使用Constructor类的newInstance()方法创建对象
- 五、使用反序列化创建对象
- 六、创建对象的5种方式调用构造器总结
- 七、示例代码(全)
- 7.1 编写Student学生类
- 7.2 编写测试类
先上关键内容,所用到的代码请参考文末示例代码。
一、使用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();
五、使用反序列化创建对象
Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;
使用反序列化:当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。
为了反序列化一个对象,我们需要让我们的类实现Serializable接口。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME)); // 5、使用反序列化创建对象 Object student5 = ois.readObject();
六、创建对象的5种方式调用构造器总结
创建对象的方式 | 是否调用了构造器 |
使用new关键字创建对象 | 是 |
Class.newInstance() | 是 |
Constructor.newInstance() | 是 |
clone() | 否 |
反序列化 | 否 |
Java创建实例对象是不是必须要通过构造函数?这其实是衍生出来的一个面试题。 上面问题的答案很明显了:Java创建实例对象,并不一定必须要调用构造器的。
七、示例代码(全)
以下是本文所用到的所有示例代码。
7.1 编写Student学生类
package com.effective.chapter2.other; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor public class Student implements Cloneable, Serializable { private String name; private Integer age; @Override public Student clone() { try { Student clone = (Student) super.clone(); // TODO: copy mutable state here, so the clone can't change the internals of the original return clone; } catch (CloneNotSupportedException e) { throw new AssertionError(); } } }
7.2 编写测试类
package com.effective.chapter2.other; import java.io.*; import java.lang.reflect.Constructor; public class CreateObjectTest { private static final String FILE_NAME = "student.obj"; public static void main(String[] args) throws InstantiationException, IllegalAccessException, IOException { // 1、使用new关键字创建对象 Student student1 = new Student(); System.out.println("使用new关键字创建对象:" + student1); // 2、使用Class类的newInstance()方法创建对象 Student student2 = Student.class.newInstance(); System.out.println("使用Class类的newInstance()方法创建对象:" + student2); // 3、使用Constructor类的newInstance()方法创建对象 Constructor student3 = Constructor.class.newInstance(); System.out.println("使用Constructor类的newInstance()方法创建对象:" + student3); // 4、使用clone()方法创建对象 Student student4 = student2.clone(); System.out.println("使用clone()方法创建对象:" + student4); try { // Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程; // 序列化对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME)); oos.writeObject(student1); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME)); // 5、使用反序列化创建对象 Object student5 = ois.readObject(); System.out.println("使用反序列化创建对象:" + student5); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }
到此这篇关于Java对象创建的几种方式总结的文章就介绍到这了,更多相关Java对象创建方式内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!
您可能感兴趣的文章:- Java循环创建对象内存溢出的解决方法
- 一文详解Java中的反射与new创建对象
- Java创建对象的六种常用方式总结
- java如何不通过构造函数创建对象(Unsafe)
- Java之不通过构造函数创建一个对象问题
用户点评