点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

来源 | 网络

五种方法创建java对象

作为Java开发人员,我们通常每天都会创建许多对象,但是我们总是使用新的或依赖管理系统(例如Spring)来创建这些对象。但是,有更多方法可以创建本文中将要研究的对象。

用Java创建对象的共有5种核心方式,下面将以其示例加以说明,然后介绍创建对象的行的字节码。但是,有很多API可以为我们创建对象,但是这些API还将间接使用这5种核心方式之一,例如Spring BeanFactory

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

1、使用新关键字

这是创建对象的最常见和常规的方法,也是一种非常简单的方法。通过使用此方法,我们可以调用要调用的任何构造函数(无参数的构造函数和参数化的)。

Employee emp1 = new Employee();

2.使用Class类的newInstance()方法

我们还可以使用Class类的newInstance()方法创建一个对象。此newInstance()方法调用no-arg构造函数来创建对象。

我们可以通过newInstance()通过以下方式创建对象:

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

Or

Employee emp2 = Employee.class.newInstance();

3.使用构造方法类的newInstance()方法

Class类的newInstance()方法类似,java.lang.reflect.Constructor类中有一个newInstance()方法可用于创建对象。我们还可以使用此newInstance()方法来调用参数化构造函数和私有构造函数。

Constructor<Employee> constructor = Employee.class.getConstructor();Employee emp3 = constructor.newInstance();

这两种newInstance()方法都被称为创建对象的反射方式。实际上,Class类的newInstance()方法在内部使用了Constructor类的newInstance()方法。这就是为什么最好使用后一种方法,并且也将其用于诸如Spring,Hibernate,Struts等不同框架的原因。要了解这两种newInstance()方法之间的区别,请阅读使用Example在Java中通过Reflection创建对象。

4.使用clone()方法:

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

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

Employee emp4 = (Employee) emp3.clone();

Java克隆是Java社区中最值得探讨的话题,它的确有其缺点,但是在对象完全满足Java克隆的强制条件之前,它仍然是创建任何对象的副本的最流行和最简单的方法。

5.使用反序列化

每当我们序列化然后反序列化一个对象时, JVM就会为我们创建一个单独的对象。在反序列化中,JVM不使用任何构造函数来创建对象。要反序列化对象,我们需要在类中实现Serializable接口。

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

正如我们在上面的字节码中看到的那样,所有四个方法调用都转换为invokevirtual(这些方法直接处理对象的创建),除了第一个转换为两个调用的方法是一个是新的,另一个是调用特殊的(对构造函数的调用)。

例:让我们考虑一个我们要为其创建对象的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 boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Employee employee = (Employee) o;return Objects.equals(name, employee.name);}@Overridepublic int hashCode() { return Objects.hash(name); }@Overridepublic String toString() { return String.format("Employee{name='%s'}", name); }@Overridepublic Object clone() {Object obj = null;try {obj = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return obj;}
}

在下面的Java程序中,我们将以所有5种方式创建Employee对象。

public class ObjectCreation {public static void main(String... args) throws Exception {// 1. Using new keywordEmployee emp1 = new Employee();emp1.setName("emp1");// 2. Using Class class's newInstance() methodEmployee emp2 = Employee.class.newInstance();emp2.setName("emp2");// 3. Using Constructor class's newInstance() methodConstructor<Employee> constructor = Employee.class.getConstructor();Employee emp3 = constructor.newInstance();emp3.setName("emp3");// 4. Using clone() methodEmployee emp4 = (Employee) emp3.clone();emp4.setName("emp4");// Serializationtry (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"))) {out.writeObject(emp4);}// 5. Using DeserializationEmployee emp5;try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"))) {emp5 = (Employee) in.readObject();emp5.setName("emp5");}System.out.println(emp1 + ", hashcode : " + emp1.hashCode());System.out.println(emp2 + ", hashcode : " + emp2.hashCode());System.out.println(emp3 + ", hashcode : " + emp3.hashCode());System.out.println(emp4 + ", hashcode : " + emp4.hashCode());System.out.println(emp5 + ", hashcode : " + emp5.hashCode());}
}

该程序将给出以下输出:

Employee Constructor Called...
Employee Constructor Called...
Employee Constructor Called...
Employee{name='emp1'}, hashcode : 3117192
Employee{name='emp2'}, hashcode : 3117193
Employee{name='emp3'}, hashcode : 3117194
Employee{name='emp4'}, hashcode : 3117195
Employee{name='emp5'}, hashcode : 3117196

往期推荐

聊聊订单系统的设计?

超详细面经:工作两年不到裸辞,投了进百份简历...

MySQL 数据库的优化,你知道有哪些?

色情版“微信”背后的秘密

免费版的 IDEA 为啥不能使用 Tomcat ?

Docker 入门终极指南:边学边用

扫一扫,关注我

一起学习,一起进步

每周赠书,福利不断

深度内容

推荐加入

最近热门内容回顾   #技术人系列

五种方法创建 Java 对象,你知道几种呢?相关推荐

  1. java保留两位小数4种方法,java保留两位小数4种方法,java两位小数4种

    java保留两位小数4种方法,java两位小数4种 java保留两位小数4种方法 方法一:String的format方法(推荐) double f = 111231.5585; System.out. ...

  2. java 对象创建过程_5种创建Java对象的方式

    在本篇文章中,将介绍5种创建Java对象的方式.类是创建对象的基本模板,接下来将介绍5种不同的方式,利用Java类来实例化Java对象. 1. 使用new关键字 ​ 采用new关键字实例化对象是Jav ...

  3. java 集合初始化_6种方法初始化JAVA中的list集合

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 1.常规方式 List languages = ne ...

  4. 十分钟,学会使用js三种方法创建本地json数据文件

    前言 在干业务时,需要得到一份全国省市到街道的区划数据,刚好业务中连接了高德地图,高德地图又提供了区划的api,这下只需要把数据写到json里了.什么!你说你还不会用js创建json文件?没关系,只需 ...

  5. php model get set方法,创建数据库对象之__set方法

    __set( )方法自动创建数据对象原始数据其实就是通过魔术方法动态创建属性的方法来生成数据对象 2. 源码:本教程如无特别说明:源码均指:Model.php 类文件中的内容. 文件位置:/think ...

  6. java遍历文件和归类_java读取文件的两种方法:java.io和java.lang.ClassLoader

    java读取文件的两种方法:java.io和java.lang.ClassLoader 什么时候使用java.io,什么时候使用java.lang.ClassLoader呢? (注:要是之前读xml文 ...

  7. 【Threejs】轮廓线、边框线、选中效果实现的N种方法以及性能评估(目前7种)

    [Threejs]轮廓线.边框线.选中效果实现的N种方法以及性能评估(目前7种) 对于模型较小,面数较少,机器性能很好的情况下,用哪种方法都可以. 但是对于压缩后glb还有100m.200m,几百万面 ...

  8. 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你

    在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 目录 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 1.文章中的标题较多,每个单独调整格式太费劲,这里我们用一 ...

  9. 比较两种php调用Java对象的方法

    Java语言功能强大,因此在许多情况下在php中来调用Java的功能将十分有用.在php中调用Java语言有两种方法,一种是使用php中 的Java扩展模块,另一种是使用minij2ee应用服务器提供 ...

最新文章

  1. 在Ubuntu18.04下的Cmake使用记录
  2. 【Prometheus】Exporter详解
  3. 【 FPGA 】序列检测器的Moore状态机实现
  4. hfss matlab联合仿真_一文搞定matlab 与 STK 联合调试仿真环境配置(文末附软件下载链接)...
  5. element-ui + vue + node.js 与 服务器 Python 应用的跨域问题
  6. php搜索文件名,php实现按文件名搜索文件的远程文件查找器
  7. 自定义ViewGroup实现仿微信图片选择器
  8. 开源个.NetCore写的 - 并发请求工具PressureTool
  9. Redmi K50系列年后登场:最高搭载天玑9000+2K直屏
  10. 神经网络中常用激活函数总结
  11. javaweb(07) Servlet详解
  12. 跳石头(最小最大问题)
  13. Shiro的详细简介解释(快速搭建官网解释代码)
  14. JavaWeb开发——软件国际化(文本元素国际化)
  15. linux设备开发详解宋宝华,[Linux设备驱动开发详解(第2版)].宋宝华.pdf
  16. Kali Linux 软件源与更新源和更新命令
  17. 谈谈《人生七年》这部纪录片
  18. 单身狗福音:钢铁直男也可以用AI歌曲俘获女友芳心!
  19. 转载:解决采集UTF-8网页空格变成问号乱码
  20. 基于android的同学录校友录系统app

热门文章

  1. BoneCP学习笔记——配置参数
  2. requests.exceptions.ConnectionError: (‘Connection aborted.‘, BadStatusLine(“‘‘“,))
  3. python3 str bytes 字符串 字节 互相转换
  4. GetMessage和PeekMessage的区别
  5. Linux Core Dump
  6. 微软资深软件工程师:阅读代码真的很难
  7. php打开gd和mysql_PHP怎么开启mysql, gd, curl, mbstring支持?
  8. android html5播放器,android Html5播放器混音解决方案
  9. 怎样学习linux系统管理员,linux系统管理员学习笔记
  10. C++ - 给出一个函数来连接两个字符串A和B,其中字符串A的后几个字节和字符串B的前几个字节重叠