引言

作为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. 阿里云视觉智能开放平台正式上线,阿里集团核心视觉AI能力对外开放

    1月底,阿里云正式推出以计算机视觉AI能力为核心的视觉智能开放平台(vision.aliyun.com),平台目前已上线8大类目,超过50多种视觉AI能力,面向人脸识别,文字识别,商品理解,内容安全, ...

  2. ACK One 构建应用系统的两地三中心容灾方案

    ​简介:本文侧重介绍了通过 ACK One 的多集群应用分发功能,可以帮助企业管理多集群环境,通过多集群主控示例提供的统一的应用下发入口,实现应用的多集群分发,差异化配置,工作流管理等分发策略.结合 ...

  3. 如何 0 改造,让单体/微服务应用成为 Serverless Application

    简介: 随着 2013 年以 Docker 为代表的容器技术.CNCF 基金会以及 K8s 的发展等,云原生开始被广大开发者所熟知.云原生时代之前还有两个阶段:一是自建 IDC 机房,二是简单地把原有 ...

  4. Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构

    ​简介:Spring官方的RSocket Broker其实开发已经非常久了,我以为会伴随着Spring Cloud 2021.0发布的,但是没有发生.不过Spring RSocket Broker还是 ...

  5. Apache Flink 在京东的实践与优化

    ​简介: Flink 助力京东实时计算平台朝着批流一体的方向演进. 本文整理自京东高级技术专家付海涛在 Flink Forward Asia 2020 分享的议题<Apache Flink 在京 ...

  6. Windows 官方提供的触屏硬件延迟测量方法

    本文记录微软 Windows 官方在 Windows Hardware Lab Kit 提供的触屏硬件延迟测量方法 Overview of measuring Touch Down Hardware ...

  7. dotnet C# 使用 Vortice 支持 Direct2D1 离屏渲染

    本文告诉大家如何使用 Vortice 进行 D2D 的离屏渲染功能,本文将在一个纯控制台无窗口的应用下,使用 Direct2D1 进行离屏绘制,将绘制结果保存为本地图片文件 本文属于使用 Vortic ...

  8. Windows下绑定线程到指定的CPU核心

    在某些场景下,需要把程序绑定到指定CPU核心提高执行效率.通过微软官方文档查询到Windows提供了两个Win32函数:SetThreadAffinityMask和SetProcessAffinity ...

  9. CompletableFuture学习总结

    CompletableFuture 简介 在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通 ...

  10. 【项目学习】Anchor:一种提供稳定币存款低波动收益率的去中心化的储蓄协议

    简介 基于稳定币的获利产品. 贷方人放出稳定币以供借款.借方通过抵押资产(base asset)的方式,以低于协议定义的借贷比率借入稳定币.Anchor 协议使用抵押资产进行质押以获得奖励,然后将质押 ...