Java中创建对象的5种方法

article/2025/10/21 12:17:19

将会列举5种方法去创建 Java 对象,以及他们如何与构造函数交互,并且会有介绍如何去使用这些方法的示例。

作为一个 Java 开发人员,我们每天都会创建大量的 Java 对象,但是我们通常会使用依赖管理系统去创建这些对象,例如 Spring 。然而,我们可以有更多的方式去创建对象,让我们一起在文章中去学习这些方法吧。

这里列举在 Java 中创建对象的五种方式,下面将介绍它们的示例,以及创建对象的行的字节码。



使用 new 关键字
构造函数会被调用
使用 Class 类的 newInstance()
构造函数会被调用
使用 Constructor 类的 newInstance()构造函数会被调用
使用 clone() 方法
无构造函数调用
使用 deserialization
无构造函数调用

如果最后执行给定的程序,您将看到方法1、2、3使用构造函数创建对象,而4、5不调用构造函数创建对象。

1.使用 new 关键字

这是创建一个对象最通用、常规的方法,同时也是最简单的方式。通过使用此方法,我们可以调用任何要调用的构造函数(默认使用无参构造函数)。



1
Employee
1 2 30:new #19 // class org/programming/mitra/exercises/Employe 3:dup 4: invokespecial #21 // Method org/programming/mitra/exercises/Employee."": ()V

2.使用 Class 类的 newInstance()

我们能够使用 Class 类的 newInstance() 方法创建对象。这个 newInstance() 方法将调用无参构造方法去创建一个对象。

在下述代码中,我们通过调用 newInstance() 去创建一个对象:

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();

或者:



1
Employee emp2 = Employee.class.newInstance();
1
51: invokevirtual #70 // Method java/lang/Class.newInstance:()Ljava/lang/Object;

3.使用 Constructor 类的 newInstance()

与 Class 类中的 newInstance() 方法相似,在此我们将使用 java.lang.reflect.Constructor 类中的 newInstance() 方法创建对象。通过使用这个 newInstance() 方法我们能够调用有参构造函数和私有构造函数。



1 2
Constructor constructor = Employee.class.getConstructor(); Employee emp3 = constructor.newInstance();
1
111: invokevirtual #80 // Method java/lang/reflect/Constructor.newInstance:([Ljava/lang/Object;)Ljava/lang/Object;

这两个 newInstance() 方法都被称为创建对象的反射方法。实际上, Class 类的 newInstance() 方法内部使用 Constructor 类的 newInstance() 方法。这就是为什么后者更受欢迎,并且也被 Spring、Hibernate、Structs 等不同的框架所使用的原因。更多关于上述两个 newInstance() 方法的区别请阅读 Creating objects through Reflection in Java with Example。

4.使用 Clone() 方法

每当我们对任何对象调用 clone() 时,jvm 都会为我们创建一个新对象,并将前一个对象的所有内容复制到其中。使用 clone 方法创建对象不会调用任何构造函数。

要在对象上使用 clone() 方法,我们需要实现 Cloneable 并在其中定义 clone() 方法。



1
Employee emp4 = (Employee) emp3.clone();
1
162: invokevirtual #87 // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;

Java 克隆是 Java 社区中最有争议的话题,它确实有它的缺点,但仍然是创建任何对象副本的最流行和最简单的方法,直到该对象完全填充 Java 克隆的强制条件。我在3篇长的 Java Cloning Series 中详细介绍了克隆,其中包括(Java Cloning And Types Of Cloning (Shallow And Deep) In Details With Example, Java Cloning - Copy Constructor Versus Cloning, Java Cloning - Even Copy Constructors Are Not Sufficient),如果你想了解更多关于克隆的知识,请继续阅读它们。

5.使用 deserialization

每当我们序列化和反序列化对象时,JVM会为我们创建了一个独立的对象。在 deserialization 中,JVM 不使用任何构造函数来创建对象。

对于序列化对象,我们需要在类中实现 Serializable 接口。



1 2
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj")); Employee emp5 = (Employee) in.readObject();
1
261: invokevirtual #118 // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;

正如我们在上面的字节码片段中看到的,4个方法都被调用并转换为 invokevirtual(对象创建由这些方法直接处理),但第一个方法被转换为两个调用:一个是 new,另一个是 invokespecial(调用构造函数)。

在我的文章中,曾经讨论过序列化和反序列化的细节,如果你想了解更多相关知识,请继续阅读:Everything About Java Serialization Explained With Example。

示例

创建对象的 Employee 类:

class Employee implements Cloneable, Serializable private static final long serialVersionUID = 1L;private String name    public Employee() {System.out.println("Employee Constructor Called...");}   public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result   ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Employee other = (Employee) obj;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}    @Overridepublic String toString() {return "Employee [name="   name   "]";}  @Overridepublic Object clone() {Object obj = null;try {obj = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return obj;}
}

在下面的 Java 程序中,我们将以5种方式创建 Employee 对象。您也可以在GitHub上找到源代码。

public class ObjectCreation {public static void main(String... args) throws Exception {// By using new keywordEmployee emp1 = new Employee();emp1.setName("Naresh");System.out.println(emp1   ", hashcode : "   emp1.hashCode());// By using Class class's newInstance() methodEmployee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();// Or we can simply do this// Employee emp2 = Employee.class.newInstance();emp2.setName("Rishi");System.out.println(emp2   ", hashcode : "   emp2.hashCode());// By using Constructor class's newInstance() methodConstructor<Employee> constructor = Employee.class.getConstructor();Employee emp3 = constructor.newInstance();emp3.setName("Yogesh");System.out.println(emp3   ", hashcode : "   emp3.hashCode());// By using clone() methodEmployee emp4 = (Employee) emp3.clone();emp4.setName("Atul");System.out.println(emp4   ", hashcode : "   emp4.hashCode());// By using Deserialization// SerializationObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"));out.writeObject(emp4);out.close();//DeserializationObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));Employee emp5 = (Employee) in.readObject();in.close();emp5.setName("Akash");System.out.println(emp5   ", hashcode : "   emp5.hashCode());}
}

此程序执行将有以下输出:

Employee Constructor Called...
Employee [name=Naresh], hashcode : -1968815046
Employee Constructor Called...
Employee [name=Rishi], hashcode : 78970652
Employee Constructor Called...
Employee [name=Yogesh], hashcode : -1641292792
Employee [name=Atul], hashcode : 2051657
Employee [name=Akash], hashcode : 63313419

原文:https://dzone.com/articles/5-different-ways-to-create-objects-in-java-with-ex

作者:Naresh Joshi

译者:陈苓洪
------

9月福利,关注公众号​后台回复:004,领取8月翻译集锦!​往期福利回复:001,002, 003即可领取!

img


http://chatgpt.dhexx.cn/article/dufRGp52.shtml

相关文章

Java创建对象的四种方式

1. new 2. clone 3. 通过反射newInstance 4. 反序列化 5. String s “abc”&#xff08;这个是比较特殊的&#xff09; 以String类为例 String string null; Class class1 String.class;// 该方法最为安全可靠&#xff0c;程序性能更高。 Class class2 string.getClass(…

c# Topshelf创建linux与Windows服务

目录 Topshelf安装Topshelf包代码如下&#xff0c;简单粗暴卸载服务安装服务 Topshelf 讨厌创建.net 服务时的窗体怎么办&#xff1f;讨厌调试.net服务怎么办?调试.net服务还要自己建控制台怎么办? Topshelf 它来了&#xff01;&#xff01;&#xff01; Topshelf 是一个开源…

htop与top命令

安装htop yum -y install htop htop 类似于 top 命令&#xff0c;但可以让你在垂直和水平方向上滚动&#xff0c;所以你可以看到系统上运行的所有进程&#xff0c;以及他们完整的命令行。可以不用输入进程的 PID 就可以对此进程进行相关的操作 (killing, renicing)。 与 Lin…

使用Quartz.net实现多线程任务定时执行,动态配置Job,结合Topshelf构建Windows服务

几个月前有这么个需求&#xff1a;需要执行一些Job&#xff0c;这些Job会各自按照不同的时间频次执行&#xff0c;且它们做的事情也不同&#xff0c;有的是监控站点&#xff0c;有的是监控服务器存储情况&#xff0c;有的是监控报表PROCEDURE的执行状况… OK&#xff0c;当看到…

top命令参数详解

简介 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。 top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直…

top命令参数详解(linux top命令的用法详细详解)

通过top命令可以有效的发现系统的缺陷出在哪里。是内存不够、CPU处理能力不够、IO读写过高。 top命令输出长这样&#xff1a; top命令参数详解&#xff08;linux top命令的用法详细详解&#xff09; 以下解析一下各个字段的意思&#xff1a; VIRT&#xff1a;virtual memory …

Topas命令详解

执行topas命令后如图所示&#xff1a; #topas 操作系统的最全面动态&#xff0c;而又查看方便的性能视图就是topas命令了&#xff0c;下面以topas输出为例&#xff0c;对AIX系统的性能监控做简要描述&#xff0c;供运维工程师和系统管理员们参考。 另&#xff1a;1.操作系统报…

Topshelf 打包部署Windows服务

1 创建项目(例&#xff1a;控制台程序) Nuget 引入Topshelf类库 using System; using System.Threading; using System.Threading.Tasks; using Topshelf;namespace LoginTypeInherit {public class Program{private static readonly log4net.ILog log log4net.LogManager.G…

Linux top命令参数详解

Linux top命令参数详解 生产环境系统运行慢&#xff0c;出现无法响应通常原因主要还在于分析CPU、内存、磁盘使用率情况&#xff0c;并结合命令查找出具体进程&#xff0c;并在进程中进一步分析主要因子情况&#xff0c;渗透到对于其中包含线程占用情况的分析。一般而言对于ja…

C#之TopShelf启动Windows服务

写了一两天&#xff0c;才发现组长给的原始代码原本就有Topshelf&#xff0c;还是写出来提示我topshelf不明确哪个版本的使用&#xff0c;莫名尴尬。 1、项目的主要运行代码 HostFactory.Run(x >{x.RunAsLocalSystem();x.SetDescription("topshelf测试");x.SetDi…

Linux下top命令用法详解

一、命令介绍 Linux top命令用于实时显示 process &#xff08;进程&#xff09;的动态。它用于监控正在运行系统负荷的信息&#xff0c;包括系统负载、CPU利用分布情况、内存使用、每个进程的资源占用情况等。 使用权限&#xff1a;所有使用者 二、命令详解 在命令行下输入…

【Linux】Top命令参数解释

TOP命令 这是一个Linux系统下 top 命令所输出的进程监控信息。以下是各列含义&#xff1a; top - 09:52:15&#xff1a;当前时间。 up 27 min&#xff1a;系统已经运行的时长。 2 users&#xff1a;当前有2个用户登录到系统上。 load average: 0.97, 0.41, 0.21&#xff1a;系…

Topshelf的使用

一、简介 Topshelf可用于创建和管理Windows服务。其优势在于不需要创建windows服务&#xff0c;创建控制台程序就可以。便于调试。 二、官方地址&#xff1a; 1、官网&#xff1a;http://topshelf-project.com/ 2、官方文档&#xff1a;https://topshelf.readthedocs.io/en/lat…

topshelf

topshelf和quartz topshelf和quartz内部分享 阅读目录: 介绍基础用法调试及安装可选配置多实例支持及相关资料quartz.net 上月在公司内部的一次分享&#xff0c;现把PPT及部分交流内容整理成博客。 介绍 topshelf是创建windows服务的一种方式&#xff0c;相比原生实现ServiceBa…

使用Quartz.net + Topshelf完成服务调用

概述&#xff1a; Quartz.NET 是一个开源作业调度库&#xff0c;可用于在 .NET 应用程序中调度和管理作业。它提供了一个灵活而强大的框架&#xff0c;用于调度作业在特定的日期和时间或以固定的时间间隔运行&#xff0c;并且还支持复杂的调度场景&#xff0c;例如 cron 表达式…

Linux中top命令参数详解

top命令用法 top命令经常用来监控linux的系统状况&#xff0c;是常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用情况。 top的使用方式 top [-d number] | top [-bnp] 参数解释&#xff1a; -d&#xff1a;number代表秒数&#xff0c;表示top命令显示…

linux 命令:top 详解

注&#xff1a;以下文档根据2019年10月的官方文档翻译。 名称&#xff1a;top - 展示linux进程信息 用法&#xff1a;top -hv|-bcEHiOSs1 -d secs -n max -u|U user -p pid -o fld -w [cols] 在top进程运行过程中&#xff0c;两个最重要的功能是查看帮助&#xff08;h 或 &…

Topshelf 搭建 Windows 服务

C# Topshelf 搭建 Windows 服务 Topshelf 是一个用来部署基于.NET Framework 开发的服务的框架。简化服务创建于部署过程&#xff0c;并且支持控制台应用程序部署为服务。本文基于 .net core 控制台应用程序部署为服务&#xff08;.net Framework 可用&#xff09;。 第一步&…

TOP命令详解

TOP命令详解 top命令经常用来监控linux的系统状况&#xff0c;是常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用情况。 top的使用方式 top [-d number] | top [-bnp]参数解释&#xff1a; -d&#xff1a;number代表秒数&#xff0c;表示top命令显示的页…

【转】Topshelf入门

windows服务用处多多啊&#xff0c;wcf宿主服务、webapi宿主服务、定时任务等都会用到&#xff0c;最近写的一套呼叫中心&#xff0c;也最终要做成windows服务&#xff0c;以前都是用vs里面自带的windows服务来写&#xff0c;但感觉总是不够方便&#xff0c;最近了解到了topshe…