java是面向对象的,所以在使用中经常会去创建对象,而我们一般创建对象只会使用new关键字去创建,这里给大家总结一下在java中创建对象的5中方法:

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

1,使用new关键字创建:

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

Employee emp1 = new Employee();
0: new           #19          // class org/programming/mitra/exercises/Employee
3: dup
4: invokespecial #21          // Method org/programming/mitra/exercises/Employee."":()V

2,使用class类的newInstance方法

我们也可以使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。

我们可以通过下面方式调用newInstance方法创建对象:

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();
或者Employee emp2 = Employee.class.newInstance();
51: invokevirtual    #70    // Method java/lang/Class.newInstance:()Ljava/lang/Object;

3,使用Constructor类的newInstance方法

和Class类的newInstance方法很像, java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();
111: invokevirtual  #80  // Method java/lang/reflect/Constructor.newInstance:([Ljava/lang/Object;)Ljava/lang/Object;

4,使用clone()方法

无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。

要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。

Employee emp4 = (Employee) emp3.clone();
162: invokevirtual #87  // Method org/programming/mitra/exercises/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(构造函数调用)。

转载于:https://www.cnblogs.com/yxfmp426756/p/6800273.html

java创建对象的5种方法相关推荐

  1. Java创建对象详解:Java创建对象的几种方法

    对象是对类的实例化.对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为.Java 对象的生命周期包括创建.使用和清除,本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与 ...

  2. Java创建对象的四种方法

    一:new运算的方式创建对象 public class Dog {String name;int age;public void show(){System.out.println("我叫& ...

  3. JavaSE(二十五)——String与StringBuffer、StringBuilder的区别、创建对象的几种方法、Http和Https的区别

    文章目录 1. String与StringBuffer.StringBuilder的区别 2. Java创建对象的几种方法 3. Http和Https的区别 1. String与StringBuffe ...

  4. java创建对象的五种方式

    java创建对象的五种方式 一.使用new关键字 二.使用clone方法 三.使用反序列化 四.使用反射 五.使用Unsafe 一.使用new关键字 如 User user=new User(); 执 ...

  5. Java 创建对象的 6 种方式,总有一种适合你

    创建对象的 6 种方式 假设有个女朋友类: @Data @NoArgsConstructor @AllArgsConstructor class GirlFriend {private String ...

  6. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  7. java文件指针,Java 测试文件指针,java测试指针,两种方法打开文件并进行内

    Java 测试文件指针,java测试指针,两种方法打开文件并进行内 两种方法打开文件并进行内容定位package com.ronsoft.books.nio.channels;import java. ...

  8. 【224期】Java 字符串拼接五种方法的性能比较分析,从执行100次到90万次?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  9. JavaScript创建对象的4种方法

    JavaScript 创建对象的4种方法 所谓对象就是用来帮助你完成一些事情是,对象是有特征和行为的,是具体特指的某一个事物.使用对象可以使程序更加整洁 通过Object()方法来创建 Object( ...

最新文章

  1. 小牛电动CEO李彦内部信:再大困难 也成涅槃重生的试炼
  2. sdut 1479 数据结构实验之栈与队列九:行编辑器
  3. 网络学习(七)Windows XP系统之纯净版安装
  4. finite state machine drawer online
  5. boost::multi_array模块测试 index_gen 的代码
  6. 3.《SQLSERVER2012之T-SQL教程》T-SQL单表查询(三)
  7. f2 柱状图滚动 钉钉小程序_详解钉钉小程序组件之自定义模态框(弹窗封装实现)...
  8. 力扣题目——350. 两个数组的交集 II
  9. 梆梆加固还原DEX文件
  10. Js 模式对话框(转)
  11. 可转债数据一览表集思录_可转债投资每周记录20200816
  12. 机器人末端执行器气爪怎么吸合_工业机器人带动末端执行器市场发展
  13. 英语不好,也能让你看懂man手册
  14. Android 通过usb调用高拍仪进行拍照
  15. 打印机显示rpc服务器,win10打印机出现RPC服务器不可用的处理办法
  16. 22. 协程与Python中的多任务异步协程
  17. 面试遇到这么一位满嘴骚话的 HR,真牛皮!
  18. docker logs命令查看日志
  19. python和表格有什么关系_Python实现和Excel基础功能对应关系
  20. 黑客攻击入侵流程及常见攻击工具

热门文章

  1. HDU 4638 Group 树状数组 + 思路
  2. LoadRunner系统架构简介与运行原理
  3. php下扩展php_curl.dll的安装
  4. idea里maven设置本地仓库报错原因
  5. zset中的score_每天五分钟,成就redis大神之Zset数据类型
  6. python接口自动化 一个变量 其他接口要用_python接口自动化测试之接口数据依赖的实现方法...
  7. ubuntu系统写路由指令_ubuntu/linux下设置永久路由
  8. url 参数 后台 加密_一套拿来即用的后台管理系统,非常方便(附项目地址)
  9. mysql节假日表_节假日常见的数据库磁盘空间处理小结
  10. python直接执行代码漏洞_修复Python任意命令执行漏洞