Java中创建对象的5种方式

作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。

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

如果你运行了末尾的的程序,你会发现方法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

如果你想学习java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料可以下载。

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等使用后者的原因。想了解这两个newInstance方法的区别,请看这篇Creating objects through Reflection in Java with Example.

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"));
261: invokevirtual #118 // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;

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

例子

让我们看一看为下面这个Employee类创建对象:

class Employee implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private String name; public Employee() {

下面的Java程序中,我们将用5种方式创建Employee对象。你可以从GitHub找到这些代码。

public class ObjectCreation { public static void main(String... args) throws Exception { // By using new keyword

程序会输出:

Employee Constructor Called... 
Employee [name=Naresh], hashcode : -1968815046
 Employee Constructor Called... 
Employee [name=Rishi], hashcode : 78970652
Employee Constructor Called... 
Employee [name=Yogesh], hashcode : -1641292792 
Employee [name=Atul], hashcode : 2051657 
Employee [name=Akash], hashcode : 63313419
时间: 2024-10-04 17:59:58

Java中创建对象的5种方式的相关文章

js中创建对象的几种方式示例介绍

 JavaScript中的所有事物都是对象,本文为大家介绍下JS中创建对象的几种方式,如原始方法.工厂方法等等 JavaScript中的所有事物都是对象:字符串.数组.数值.函数等.JS中并没有类的概念,    但我们可以利用JS的语法特征,以类的思想来创建对象.    原始方法   代码如下: <script type="text/javascript">    var obj = new Object();  obj.name = "Koji"; /

javascript中创建对象的几种方式

原文:javascript中创建对象的几种方式 javascript中提供了通过Object构造函数或对象字面量方式来创建单个的对象,当我们想要创建很多对象的时候,简单的通过这两种方法就会产生大量的重复.在此,我总结了几种创建对象的模式.本文是在我阅读<javascript高级程序设计>后总结而来. 1.工厂模式 这种模式通过用函数来减少代码重复,利用函数的参数作为接口,与对象的属性与方法对接. function createfactory(name,age){ var obj = new O

详细分析Javascript中创建对象的四种方式_javascript技巧

前言 使用Javascript创建对象的方式有很多,现在就来列举一下其中的四种方式,并且罗列出了每种方式的优缺点,可以让大家进行选择使用,下面来看看. 工厂模式 function createPerson(name, age){ var obj = new Object(); obj.name = name; obj.age = age; return obj; //一定要返回,否则打印undefined:undefined } var person1 = new createPerson('Y

java中创建对象的几种方法和clone

对象创建的几种方法:1.使用new关键字2.使用clone方法3.反射机制4.反序列化以上四种都可以产生java对象1,3都会明确的显式的调用构造函数2是在内存上对已有对象的影印 所以不会调用构造函数4是从文件中还原类的对象 也不会调用构造函数 不用构造方法也能创建对象? http://www.iteye.com/problems/56043 详解Java中的clone方法 http://www.2cto.com/kf/201401/273852.html 本文出自 "点滴积累" 博客

js中创建对象的几种方式示例介绍_javascript技巧

JavaScript中的所有事物都是对象:字符串.数组.数值.函数等.JS中并没有类的概念, 但我们可以利用JS的语法特征,以类的思想来创建对象. 原始方法 复制代码 代码如下: <script type="text/javascript"> var obj = new Object(); obj.name = "Koji"; //为对象添加属性 obj.age = 21; obj.showName = function(){ //为对象添加方法 ale

java异常-Java如何处理异常有几种方式,如何处理的

问题描述 Java如何处理异常有几种方式,如何处理的 我是新手,求各位前辈,大牛教下我,万分感谢!希望能给我一些详细解说,在此谢谢了 解决方案 package com.eric.exception; public class RethrowException { public static void main(String[] args) { try { // g0(); // g1(); // g2(); // g3(); g6(); } catch (Exception e) {......

Java项目中连接数据库的几种方式和范例

连接数据库|项目 Java项目中连接数据库的几种方式和范例 1, 最原始的写法(也是一般初学者的写法) 首先import数据库连接基础类,然后其它的然后就简单了.实际操作过程中只需加载驱动程序类,之后调用sql语句就行了.以下是一个简单的程序例子. //Select.java import java.net.URL; import java.sql.*; class Select{ public static void main(String[] args){ try{ //创建连接URL St

javascript中创建对象的几种方法总结_javascript技巧

前言: 随着web 2.0 的兴起(最具代表性的是Ajax技术了),javascript不再是程序员眼中的"玩具语言". 编程在不断的简化,可是"用户体验.性能.兼容性.可扩展......"要求却在不断提高,随之涌现出Prototype.jQuery.ExtJs.Dojo等优秀的框架(类库),大大简化了web开发. 越来越多的人开始深入研究和使用javascript,当然,企业对开发者的要求也越来越高.就拿自己的经历来讲,零几年的时候,我能拿javascript写一

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方