`

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中创建对象的不同方式和String创建对象的不同方式

    JAVA创建对象的四种方法

    java在创建对象的时候使用的创建对象可以用到很多模式,比如工厂模式。。。反射。。等等

    java创建xml对象

    本项目基于java创建xml文档对象,方便对xml文档的读写。

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

    Java 创建对象的五种方式 使用 new 来创建对象 使用 newInstance 方法来创建 使用反射来创建对象 使用对象克隆来创建对象 使用反序列化创建对象

    java对象创建过程

    详细介绍java对象的创建过程,以致对java基础详细的掌握!

    在JAVA中创建对象.pdf

    在JAVA中创建对象.pdf

    JNI创建java对象

    这是我用于测试,主要用于jni创建java对象病操作

    java创建对象的五种方法demo

    java创建对象的5种方法,每种方法都有demo,并且亲自运行通过的,有需要的可以自行下载参考

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

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

    java中创建对象的步骤有哪些.txt

    在Java中创建对象的步骤通常包括以下几个步骤: 定义类(Class):类是一个定义了对象的特性的蓝图,包括数据和方法。例如,我们可以定义一个名为“Person”的类,其中包含姓名和年龄等数据以及一些方法,如“set...

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

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

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

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

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

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

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

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

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

    介绍java对象的创建、初始化、和引用。并分析一下JAVA中对象创建和初始化过程中涉及的相关概念问题。

    Java对象的创建过程结合反射

    Java对象的创建过程结合反射进行解析。

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

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

    实验三:Java类与对象

    本次实验进一步学习了Java的相关知识,深入理解了面向过程与面向对象语言的区别,了解了面向对象语言的三大特征,掌握类的声明和构造方法,掌握了对象的创建方法与创建机制,掌握了成员变量、类变量和局部变量区别,...

    漫画面向对象编程 Java

    面向对象的简、由类创建一个对象的方法、类的编写与对象的创建、类的构造函数、类的方法、修饰符、Java中的封装/继承/多态等特征、Java中的线程、用Java创建一个小世界、多线程共享数据,以及面向对象中的各种设计...

    Java中创建对象的5种方式总结

    本篇文章主要介绍了Java中创建对象的5种方式总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Global site tag (gtag.js) - Google Analytics