首页 > 其他分享 >创建对象的五种方式

创建对象的五种方式

时间:2022-11-01 11:36:26浏览次数:39  
标签:调用 方式 newInstance 创建对象 五种 Employee 方法 构造函数


创建对象的五种方式

Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码:

创建对象方法

是否调用构造函数

使用new关键字

} → 调用了构造函数

使用Class类的newInstance方法

} → 调用了构造函数

使用Constructor类的newInstance方法

} → 调用了构造函数

使用clone方法

} → 没有调用构造函数

使用反序列化

} → 没有调用构造函数

如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建对象,方法4,5没有调用构造函数。

1.使用new关键字

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

Employee emp1 = new Employee();
0: new #19 // class org/programming/mitra/exercises/Employee3: dup4: 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;

这两种newInstance方法就是大家所说的反射。事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架,如Spring、Hibernate、Struts等使用后者的原因。

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(构造函数调用)。


标签:调用,方式,newInstance,创建对象,五种,Employee,方法,构造函数
From: https://blog.51cto.com/u_13351110/5812913

相关文章

  • Linux运行程序的3中方式
    Linux环境运行程序一、交互式命令运行这是Linux执行程序最常用的一种方式,通过shell在交互命令行里面运行。这种模式的缺点是,一旦当前的交互命令行退出,程序就停止运行......
  • postgresql13 rpm方式安装
    环境:OS:Centos7DB:13.8 1.介质下载可以到官网下载相应版本的rpm介质我这里下载的如下介质[root@localhostpg]#ls-lrttotal7968-rw-r--r--.1rootroot1481300......
  • 解决layui表单ajax提交回调函数不起作用问题的两种方式
    最近想用layui开发一个论坛模板用的是fly-ui,才接触layui对其还不太熟悉。一个简单的登录就困扰了我很久。登录的form通过ajax提交回调函数老是不起作用。经过浪费了N多时间......
  • java操作http请求的三种方式
    java操作http请求的三种方式一、HttpClient步骤:1.获取一个Http客户端CloseableHttpClienthttpClient=HttpClients.createDefault();2.创建一个请求HttpGethttpGet......
  • vue动态绑定class的几种方式
    开发项目中:vue动态绑定class的几种方式~第一种:(最简单的绑定)1.绑定单个classhtml部分: <div:class="{'active':isActive}"></div>js部分:判断是否绑定一个activedat......
  • 以开发之名 | 小红书:用年轻人的方式开发年轻人喜欢的应用
    2013年,小红书在上海成立,同年12月,小红书推出海外购物分享社区。一个开放式的体验型分享社区走进了数亿用户的生活。每个人都能在这个开放社区,分享自己的生活笔记,给有同样需......
  • Python开发 之 两种爬虫的方式 正则表达式、XPath
    文章目录​​1、简介​​​​2、简单爬取基本信息——效果图​​​​3、先将一下利用正则的方式​​​​3.1简单理解​​​​3.2源码​​​​4、XPath​​​​4.1简单介......
  • [I.MX6UL] 用STM32的方式来写I.MX6UL程序
    /**************************************************************Copyright©zuozhongkaiCo.,Ltd.1998-2019.Allrightsreserved.文件名:mian.c作者:左......
  • CentOS9上面使用rpm方式安装SQLServer2022的简单总结
    CentOS9上面使用rpm方式安装SQLServer2022的简单总结下载需要的资料下载CentOS9Stream的安装介质https://mirrors.bfsu.edu.cn/centos-stream/9-stream/BaseOS/x86_64......
  • Go开发 之 JSON转换成Go的struct的快捷方式
    简述以前都是自己按照json的格式来手动写,到现在才知道go有这么方便的方式,记下来哟。Github提供了比较号的处理方式​​https://mholt.github.io/json-to-go/​​效果图使用......