Java中创建对象的5种方式总结
引言
作为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种方式总结的更多相关文章
- Java中创建对象的几种方式
Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...
- Java中创建对象的五种方式
我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...
- 【转】Java中创建对象的5种方式
Java中创建对象的5种方式 作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有 ...
- Java中创建对象的5种方式
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
- Java中创建对象的5种方式 &&new关键字和newInstance()方法的区别
转载:http://www.kuqin.com/shuoit/20160719/352659.html 用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: ...
- Java技术——Java中创建对象的5种方式
此文为译文 原文连接:https://dzone.com/articles/5-different-ways-to-create-objects-in-java-with-ex 0. 前言 作为Jav ...
- Java 中创建对象的 5 种方式!
Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Employee类: class Employee implements Cloneable, Serializable { pri ...
- 第一弹:Java 中创建对象的4种方式
Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使 ...
- 第001弹:Java 中创建对象的4种方式
Java 是面向对象的语言,不可避免的,“对象”这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的方法: 使用 new 关键字调 ...
- Java中创建对象的5种方法
将会列举5种方法去创建 Java 对象,以及他们如何与构造函数交互,并且会有介绍如何去使用这些方法的示例. 作为一个 Java 开发人员,我们每天都会创建大量的 Java 对象,但是我们通常会使用依赖 ...
随机推荐
- WPF 获取本机所有字体拿到每个字符的宽度和高度
本文主要采用 GlyphTypeface 类尝试获取每个字符的宽度和高度的值,尽管这个方法和最终 WPF 布局使用的文本的宽度和高度是不相同的,但是依然可以作为参考 获取系统字体文件夹的文件 系统字体 ...
- ES6中Promise方法详解
概要 Promise是个保存异步结果的容器(对象). Promise的状态有:pending(进行中),fulfilled(已成功),rejected(已失败),对应其异步操作的状态. 状态转换: p ...
- Pinpoint对k8s关键业务模块进行全链路监控(17)
一.全链路监控概述 1.1 什么是全链路监控 在分布式微服务架构中,系统为了接收并处理一个前端用户请求,需要让多个微服务应用协同工作,其中 的每一个微服务应用都可以用不同的编程语言构建,由不同的团队开 ...
- C51笔记-数码管#动态扫描#静态显示#中断#定时器
- 使用 Docker 自建一款怀旧游戏之 - 扫雷
1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中.游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷.每个方 ...
- ruby后台传变量到前端的JS里
后端变量 @namelist 前端解释 var result_json = <%= @namelist.to_json.html_safe %>
- Oracle用户创建、赋权、查询及删除操作
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- SQL中常用的字符串REPLACE函数和LEN函数详解!
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- CSRF(Pikachu靶场练习)
CSRF(get) 自己随便输点东西,回显登录失败,查看源码没发现什么 点开提示,登录进去看看 看到可以修改个人信息,我们把居住改成China,修改成功,没发现urlhttp://127.0.0.1/ ...
- 渐变颜色css设置
小说付费章节渐变颜色配置 position: absolute; top: 0; left: 0; width: 100%; height: 211px; transform: translateY( ...