专栏首页BAT的乌托邦【小家java】Java中5种创建对象的方法,你知道几种?

【小家java】Java中5种创建对象的方法,你知道几种?


作为一个Java开发者,一种面向对象的语言,我们每天都创建很多对象。但后续我们开发中,采用了spring的依赖管理系统,我们就很少自己去创建对象了,全部交给容器去托管,那么本篇文章回源塑本,讲述一下java中能够创建一个对象的5中方法。

本文最大的特色是,我不仅给出案例,还给出对应的字节码解释,从底层来解释现象

1.使用new关键字

这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。

Employee emp1 = new Employee();

字节码:

0: new           #19          // class com/fsx/demo/Employee
3: dup
4: invokespecial #21          // Method com/fsx/demo/Employee."":()V

2.使用Class类的newInstance方法

这个方法创建对象其实我们用得也比较多,but,这个newInstance方法调用无参的构造函数创建对象。所以类必须有public无参构造函数才行

Employee emp2 = (Employee) Class.forName("com.fsx.demo.mployee").newInstance();
或者
Employee emp2 = Employee.class.newInstance();

字节码:

51: invokevirtual    #70    // Method java/lang/Class.newInstance:()Ljava/lang/Object;

3.使用Constructor类的newInstance方法

和Class类的newInstance方法很像。但是它可以调用任意构造函数创建对象,包括私有的。(所以即使你私有了构造函数,spring还是可以给你创建对象)

事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架,如Spring、Hibernate、Struts等直接使用后者的原因

4.使用clone方法

无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。 备注:要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。

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

字节码:

162: invokevirtual #87  // Method com/fsx/demo//Employee.clone ()Ljava/lang/Object;

5.使用反序列化

当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。 备注:为了反序列化一个对象,我们需要让我们的类实现Serializable接口

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

字节码:

261: invokevirtual  #118   // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;

总结:

我们从上面的字节码片段可以看到,除了第1个方法,其他4个方法全都转变为invokevirtual(创建对象的直接方法),第一个方法转变为两个调用,new和invokespecial(构造函数调用)。

直接给出是否调用了构造函数的结论:

  1. 使用new关键字 } → 调用了构造函数
  2. 使用Class类的newInstance方法 } → 调用了构造函数
  3. 使用Constructor类的newInstance方法 } → 调用了构造函数
  4. 使用clone方法 } → 没有调用构造函数
  5. 使用反序列化 } → 没有调用构造函数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势

    Tiago Fernandez做了一个很有意思的投票,统计对Java API的不满意程度,最终Java Date/Time/Calendar API被评为最烂A...

    BAT的乌托邦
  • 【小家java】java6新特性(简述十大新特性) 鸡肋升级

    评价:鸡肋的版本,有JDBC4.0更新、Complier API、WebSevice支持的加强等更新。

    BAT的乌托邦
  • 【小家java】java8新特性(简述十大新特性) 饱受赞誉

    截止稿前,java10都已经发布了,现在我们来讨论一下java8(2014年3月发布)。 本文的讨论,只是一个简述,更加具体的,各位可以参照各自的专题讲解

    BAT的乌托邦
  • python定时下载FTP指定文件

    公司正好有个需求,定期从远端ftp下载指定昨天的数据,写了2个函数,一个是连接远端ftp,另一个是定期下载远端数据,用到了ftplib、datetime和正则r...

    用户2398817
  • #python# 来找茬

    滚神大人
  • 跳跃表原理

    跳表这种特殊的数据结果是有 Willam Pugh 发明的。最早出现在1990 年发表的论文《Skip Lists: A Probabilistic Alte...

    王小明_HIT
  • Groovy秘诀 顶

    听说java世界里有个Groovy大神!java需要半天处理的事情,Groovy只需要几分钟,是的,几分钟…剩下来的时间,程序员终于有时间泡妹子了,^_^……....

    白石
  • InnoDB的表空间介绍

    我们知道,磁盘和内存之间的数据交换是通过数据页来实现的,而最小的数据页的大小是16KB,表空间是用来存储数据页的一个池子,下面我们来说说表空间的概念。

    AsiaYe
  • MapReduce 计数器简介

    1、计数器简介 在许多情况下,一个用户需要了解待分析的数据,尽管这并非所要执行的分析任务 的核心内容。以统计数据集中无效记录数目的任务为例,如果发现无效...

    用户1177713
  • [每日一题]数字整除

    C语言的奇葩之一就是明明可以直接除以17解决的问题偏偏要搞得这么麻烦 但我们能有什么办法呢,只能说是对思想的锻炼了呗! 题目描述 定理:把一个至少两位的正整...

    编程范 源代码公司

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动