写点什么

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

作者:No8g攻城狮
  • 2023-02-18
    河南
  • 本文字数:2077 字

    阅读完需:约 7 分钟

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

一、使用 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 接口。

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

复制代码

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


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@NoArgsConstructorpublic 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 = new Student().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); } }}
复制代码


本文首发于 CSDN,为博主原创文章,如果需要转载,请注明出处,谢谢!


完结!

发布于: 2023-02-18阅读数: 33
用户头像

No8g攻城狮

关注

熟了再告诉你 2022-12-03 加入

热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长

评论

发布
暂无评论
【Java基础】Java对象创建的几种方式_Java_No8g攻城狮_InfoQ写作社区