`

Java中创建对象的5种方式

 
阅读更多

Java中创建对象的5种方式

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

 

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

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;

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

 

例子

 

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

class Employee implements Cloneable, Serializable {   
    private static final long serialVersionUID = 1L;   
    private String name;   
    public Employee() {   
        System.out.println("Employee Constructor Called...");   
    }   
    public String getName() {   
        return name;   
    }   
    public void setName(String name) {   
        this.name = name;   
    }   
    @Override   
    public int hashCode() {   
        final int prime = 31;   
        int result = 1;   
        result = prime * result + ((name == null) ? 0 : name.hashCode());   
        return result;   
    }   
    @Override   
    public boolean equals(Object obj) {   
        if (this == obj)   
            return true;   
        if (obj == null)   
            return false;   
        if (getClass() != obj.getClass())   
            return false;   
        Employee other = (Employee) obj;   
        if (name == null) {   
            if (other.name != null)   
                return false;   
        } else if (!name.equals(other.name))   
            return false;   
        return true;   
    }   
    @Override   
    public String toString() {   
        return "Employee [name=" + name + "]";   
    }   
    @Override   
    public Object clone() {   
        Object obj = null;   
        try {   
            obj = super.clone();   
        } catch (CloneNotSupportedException e) {   
            e.printStackTrace();   
        }   
        return obj;   
    }   
}

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

public class ObjectCreation {   
    public static void main(String... args) throws Exception {   
        // By using new keyword   
        Employee emp1 = new Employee();   
        emp1.setName("Naresh");   
        System.out.println(emp1 + ", hashcode : " + emp1.hashCode());   
        // By using Class class's newInstance() method   
        Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")   
                               .newInstance();   
        // Or we can simply do this   
        // Employee emp2 = Employee.class.newInstance();   
        emp2.setName("Rishi");   
        System.out.println(emp2 + ", hashcode : " + emp2.hashCode());   
        // By using Constructor class's newInstance() method   
        Constructor<Employee> constructor = Employee.class.getConstructor();   
        Employee emp3 = constructor.newInstance();   
        emp3.setName("Yogesh");   
        System.out.println(emp3 + ", hashcode : " + emp3.hashCode());   
        // By using clone() method   
        Employee emp4 = (Employee) emp3.clone();   
        emp4.setName("Atul");   
        System.out.println(emp4 + ", hashcode : " + emp4.hashCode());   
        // By using Deserialization   
        // Serialization   
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"));   
        out.writeObject(emp4);   
        out.close();   
        //Deserialization   
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));   
        Employee emp5 = (Employee) in.readObject();   
        in.close();   
        emp5.setName("Akash");   
        System.out.println(emp5 + ", hashcode : " + emp5.hashCode());   
    }   
}

程序会输出:

public class ObjectCreation {   
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
分享到:
评论

相关推荐

    JAVA创建对象的四种方法

    -java 创建对象的四种方法是指在 Java 中创建对象的不同方式,它们分别是使用 new 语句创建对象、使用反射机制创建对象、使用 clone() 方法创建对象和使用反序列化机制创建对象。 - 使用 new 语句创建对象是 Java ...

    java四种创建对象的方式

    Java中创建对象主要有四种显式的方式,分别是使用new关键字、反射机制、克隆克隆方法以及反序列化手段。每种方法都有其特定的使用场景和特点,以下是这些方法的详细说明: 1. 使用new关键字创建对象 这是最常见也是...

    Java创建对象的5种方式.java

    本文将详细讲解Java中创建对象的五种常见方式。 1. **构造器实例化** 最常见的方式是通过类的构造器来创建对象。构造器是一个特殊的方法,用于初始化新创建的对象。在类定义中,我们可以声明一个或多个构造器,每...

    在JAVA中创建对象.pdf

    在 Java 中,还可以使用克隆的方式来创建对象,例如:Employee original = new Employee("John", 25); Employee copy = (Employee) original.clone();Copying an object is a common operation in Java programming,...

    java创建对象的五种方法demo

    下面将详细讲解Java中创建对象的五种方法,并通过实际示例进行演示。 1. **使用`new`关键字构造器创建对象** 这是最常见、最直接的方法。每个类都有一个构造器,用于初始化新创建的对象。例如,假设我们有一个名为...

    Java中控制创建对象的个数

    在Java编程语言中,控制创建对象的个数是一项重要的任务,尤其在资源管理或实现单例模式时。这里,我们将深入探讨如何通过不同的方法限制Java中对象的创建。 首先,让我们了解基本的对象创建过程。在Java中,我们...

    《剑指offer》Java创建对象的五种方式.pdf

    根据标题和描述,我们将详细探讨Java创建对象的五种主要方式。 1. **使用`new`关键字创建对象** 这是最常见的创建对象的方式,通过调用类的构造器来实例化对象。例如: ```java Object obj = new Object(); ```...

    java中对象创建、初始化、引用

    通过上述内容,我们可以了解到在Java中创建对象、初始化以及引用传递的基本流程和概念。对象是通过类创建出来的实例,而引用则是指向这些对象的指针。理解和掌握这些基本概念对于深入学习Java编程至关重要。此外,...

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

    Java 语言中创建对象的四种方式是:用 new 语句创建对象、运用反射手段、调用对象的 clone() 方法和运用反序列化手段。下面我们将详细阐述每种方法的实现原理和代码示例。 1. 用 new 语句创建对象 这是最常见的...

    java中把对象转化为byte数组的方法.doc

    Java 提供了两种方式来实现序列化:一种是使用 Serializable 接口,另一种是使用 Externalizable 接口。 在上面的代码中,我们可以看到, ByteToObject 方法将 byte 数组转化为对象,而 ObjectToByte 方法将对象...

    Java创建对象与C++创建对象的比较

     Java和C++都是面向对象的编程语言,然而Java和C++在创建对象时却存在不同的方式,由于方式的不同导致在内存中管理的不同。  1、C++创建对象方式  在C++中我们可以采用如下两种方式来创建对象, 1 Dog ...

    8.java子类对象的创建.zip

    8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java子类对象的创建.zip8.java...

    探讨Java的对象是怎么在内存中产生的?

    本文将详细探讨Java对象在JVM中的创建过程以及其内存布局,帮助读者更深入地理解Java对象是如何在内存中产生的。 #### 二、对象的创建 Java对象是由类实例化的结果,当我们使用`new`关键字创建一个对象时,实际上...

    74.java类的定义与创建对象.zip

    74.java类的定义与创建对象.zip74.java类的定义与创建对象.zip74.java类的定义与创建对象.zip74.java类的定义与创建对象.zip74.java类的定义与创建对象.zip74.java类的定义与创建对象.zip74.java类的定义与创建对象....

    Java试题-5:应用反射创建对象,调用对象方法

    Java试题-5:应用反射创建对象,调用对象方法 反射为Java的高级技术应用

    java对象创建与回收demo

    在Java编程语言中,对象是程序的基本构建块,它们代表了现实世界中的实体或概念。对象的创建和回收是Java内存管理的重要组成部分,这主要涉及到堆内存和垃圾收集机制。让我们深入探讨一下这个主题。 首先,Java对象...

    7.java对象的创建和使用.zip

    7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和使用.zip7.java对象的创建和...

    Java中创建初始化对象.pdf

    5. **对象的清除**:在Java中,对象的清除主要是通过垃圾收集器(Garbage Collector)自动完成的。当一个对象不再被任何引用所指向时,垃圾收集器会回收其占用的内存空间。然而,程序员通常不直接控制这个过程,而是...

Global site tag (gtag.js) - Google Analytics