引言

作为Java开发人员,我们每天都会代码中创建对象,但我们通常使用依赖管理系统,比如Spring框架,然后,这里有很多种创建对象的方式,本文就对Java创建对象的几种方式进行总结

五种创建方式

创建方式 特点
使用new关键字 } → 调用了构造函数
使用Class类的newInstance方法 } → 调用了构造函数
使用Constructor类的newInstance方法 } → 调用了构造函数
使用clone方法 } → 没有调用构造函数
使用反序列化 } → 没有调用构造函数

1. new关键字创建

    public static void create1(){
Object object = new Object();
}

在Class文件中这段代码如下

0 new #3 <java/lang/Object>
3 dup
4 invokespecial #1 <java/lang/Object.<init>>
7 astore_0
8 return

释义:

其中new指令在java堆上为 object 对象分配内存空间,并将地址压入操作数栈顶

dup指令为复制操作数栈顶值,并将其压入栈顶,也就是说此时操作数栈上有连续相同的两个对象地址

invokespecial指令调用实例初始化方法)V,注意这个方法是一个实例方法,所以需要从操作数栈顶弹出一个DupTest 对象的引用,也就是说这一步会弹出一个之前入栈的对象地址;

astore_0 指令从操作数栈顶取出 object 对象的引用并存到局部变量表;

最后由return指令结束方法。

2. Class类的newInstance

先获取其Class对象,再调用newInstance方法,这个newInstance方法调用无参的构造函数创建对象。

    public static void create2() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class clazz = Class.forName("com.ycb.createinstance.Student");
Student student = (Student)clazz.newInstance();
}

方法对应的字节码

 0 ldc #4 <com.ycb.createinstance.Student>
2 invokestatic #5 <java/lang/Class.forName>
5 astore_0
6 aload_0
7 invokevirtual #6 <java/lang/Class.newInstance>
10 checkcast #7 <com/ycb/createinstance/Student>
13 astore_1
14 return

3. Constructor类的newInstance

通过Class拿到指定的构造方法,再调用构造方法的newInstance方法创建对象

    public static void create3() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Constructor<Student> constructor = Student.class.getConstructor();
Student student = constructor.newInstance();
}

4. clone方法创建

通过clone方法创建对象,并不会调用其构造方法,本质是通过对象内存的复制实现的

    public static void create4() throws CloneNotSupportedException {
Student student = new Student();
//要调用clone方法,必须要实现Cloneable接口,并重写其方法
Student clone =(Student) student.clone();
}

5. 反序列化创建

为了要反序列化对象,对Class必须要实现Serializable接口

反序列化创建对象,不会调用其构造方法

    public static void create5() throws Exception{
Student student = new Student();
//使用序列化方式创建对象 //序列化
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("student.obj"));
objectOutputStream.writeObject(student);
objectOutputStream.close(); //反序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream("student.obj"));
Student student1 = (Student) in.readObject();
in.close();
}

Java中创建对象的5种方式总结的更多相关文章

  1. Java中创建对象的几种方式

    Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...

  2. Java中创建对象的五种方式

    我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...

  3. 【转】Java中创建对象的5种方式

    Java中创建对象的5种方式   作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有 ...

  4. Java中创建对象的5种方式

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  5. Java中创建对象的5种方式 &&new关键字和newInstance()方法的区别

    转载:http://www.kuqin.com/shuoit/20160719/352659.html 用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: ...

  6. Java技术——Java中创建对象的5种方式

    此文为译文 原文连接:https://dzone.com/articles/5-different-ways-to-create-objects-in-java-with-ex 0. 前言 作为Jav ...

  7. Java 中创建对象的 5 种方式!

    Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Employee类: class Employee implements Cloneable, Serializable { pri ...

  8. 第一弹:Java 中创建对象的4种方式

    Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使 ...

  9. 第001弹:Java 中创建对象的4种方式

    Java 是面向对象的语言,不可避免的,“对象”这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使用 new 关键字调 ...

  10. Java中创建对象的5种方法

    将会列举5种方法去创建 Java 对象,以及他们如何与构造函数交互,并且会有介绍如何去使用这些方法的示例. 作为一个 Java 开发人员,我们每天都会创建大量的 Java 对象,但是我们通常会使用依赖 ...

随机推荐

  1. 赋予企业更多可能,云数据库SQL Server 2019版这几大亮点别错过

    直播预告 2020年3月26日 15:00-16:30 邀您一同见证 云数据库SQL Server 2019版重磅发布 全面提升性价比及数据库能力 点我观看 RDS SQL Server 2019不仅 ...

  2. 阿里巴巴在 Envoy Gateway 的演进历程浅析

    ​简介:最近阅读 <Envoy Gateway 来了>这篇文章,深感 Envoy 强大的可扩展性和基于 Envoy Gateway 带来的易用性,在 K8s 架构下,Envoy 重新定义了 ...

  3. 业内首款云原生技术中台产品云原生 Stack 来了!

    简介: 云原生 Stack 满足了各种典型场景下客户对于线下高集成平台的诉求,让企业数字话转型不受技术约束,专注业务本身,加速企业数字化迭代. 今天,企业数字化转型依然面临很大的挑战,虽然有很多新技术 ...

  4. LlamaIndex 起步教程(本地模型)

    提示:确保您已先按照自定义安装步骤操作. 这是一个著名的"五行代码"起步示例,使用本地 LLM(大语言模型)和嵌入模型.我们将使用 BAAI/bge-small-en-v1.5 作 ...

  5. 01二分 [AGC006D] Median Pyramid Hard + P2824 [HEOI2016/TJOI2016] 排序

    [AGC006D] Median Pyramid Hard 考虑对于一个长度为 2n + 1 的 01 序列 b 如何快速确定堆顶元素. _ _ _ _ x _ _ _ 0 x _ _ 0 0 x _ ...

  6. 聊聊流言协议(Gossip)

    什么是流言协议? 在分布式系统中,以下两个是典型的问题: 维护系统状态(节点的活跃性) 节点间的通信 解决这些问题的解决方案之一如下: 集中式状态管理服务 对等状态管理服务 集中式状态管理服务 像 A ...

  7. 大营销抽奖系统,DDD开发要如何建模?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. ‍ 经过5.1假期的一顿框框输出,终于完成了<大营销项目 ...

  8. ubuntu下安装php pdo扩展和导入数据库

    默认安装的php不存在pdo扩展,因此在使用到的时候会报错,直接使用这个命令 apt-get install php-mysql 就可以成功安装pdo扩展 安装完数据库后需要导入sql语句,先进入数据 ...

  9. ansible系列(34)--ansible实战之部署WEB集群架构(4)

    目录 1. 业务环境部署 1.1 wordpress-base编写 1.2 wordpress-web编写 1.3 wordpress-mysql编写 1.4 wordpress-proxy编写 1. ...

  10. 在 JS 中使用 canvas 给图片添加文字水印

    实现说明: 1.先通过 new Image() 载入图片: 2.图片加载成功后使用 drawImage() 将图片绘制到画布上: 3.最后使用 fillText() 函数绘制水印. 下面展示了详细用法 ...