91丨国产丨白浆秘 喷水,国产熟妇毛多 A片欧美蜜臀,北京熟妇搡BBBB搡BBBB,国产精品人人做人人爽人人添

  您的位置: 【卓安特保-您身邊的護(hù)衛(wèi)專家】山東卓安安防工程有限公司,電話13361029977 >> 安防資訊 >> 卓安安防 >> JAVA編程
 閱讀文章

Java中創(chuàng)建對(duì)象的5種方式

  文章作者:網(wǎng)絡(luò)來源:網(wǎng)絡(luò)轉(zhuǎn)摘瀏覽次數(shù):7849字體:字體顏色
 閱讀權(quán)限:游客身份花費(fèi)會(huì)員幣:0添加時(shí)間:2020/4/12 21:32:11提交會(huì)員:李漠

聯(lián)網(wǎng)報(bào)警|山東卓安安防工程有限公司|15562629707|15562629707|監(jiān)控安裝

作為Java開發(fā)者,我們每天創(chuàng)建很多對(duì)象,但我們通常使用依賴管理系統(tǒng),比如Spring去創(chuàng)建對(duì)象。然而這里有很多創(chuàng)建對(duì)象的方法,我們會(huì)在這篇文章中學(xué)到。

Java中有5種創(chuàng)建對(duì)象的方式,下面給出它們的例子還有它們的字節(jié)碼

使用new關(guān)鍵字

} → 調(diào)用了構(gòu)造函數(shù)

使用Class類的newInstance方法

} → 調(diào)用了構(gòu)造函數(shù)

使用Constructor類的newInstance方法

} → 調(diào)用了構(gòu)造函數(shù)

使用clone方法

} → 沒有調(diào)用構(gòu)造函數(shù)

使用反序列化

} → 沒有調(diào)用構(gòu)造函數(shù)

如果你運(yùn)行了末尾的的程序,你會(huì)發(fā)現(xiàn)方法1,2,3用構(gòu)造函數(shù)創(chuàng)建對(duì)象,方法4,5沒有調(diào)用構(gòu)造函數(shù)。

1.使用new關(guān)鍵字

這是最常見也是最簡(jiǎn)單的創(chuàng)建對(duì)象的方式了。通過這種方式,我們可以調(diào)用任意的構(gòu)造函數(shù)(無參的和帶參數(shù)的)。

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方法創(chuàng)建對(duì)象。這個(gè)newInstance方法調(diào)用無參的構(gòu)造函數(shù)創(chuàng)建對(duì)象。

我們可以通過下面方式調(diào)用newInstance方法創(chuàng)建對(duì)象:

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類里也有一個(gè)newInstance方法可以創(chuàng)建對(duì)象。我們可以通過這個(gè)newInstance方法調(diào)用有參數(shù)的和私有的構(gòu)造函數(shù)。

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方法就是大家所說的反射。事實(shí)上ClassnewInstance方法內(nèi)部調(diào)用ConstructornewInstance方法。這也是眾多框架,如Spring、HibernateStruts等使用后者的原因。想了解這兩個(gè)newInstance方法的區(qū)別,請(qǐng)看這篇Creating objects through Reflection in Java with Example.

4.使用clone方法

無論何時(shí)我們調(diào)用一個(gè)對(duì)象的clone方法,jvm就會(huì)創(chuàng)建一個(gè)新的對(duì)象,將前面對(duì)象的內(nèi)容全部拷貝進(jìn)去。用clone方法創(chuàng)建對(duì)象并不會(huì)調(diào)用任何構(gòu)造函數(shù)。

要使用clone方法,我們需要先實(shí)現(xiàn)Cloneable接口并實(shí)現(xiàn)其定義的clone方法。

Employee emp4 = (Employee) emp3.clone();

162: invokevirtual #87  // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;

5.使用反序列化

當(dāng)我們序列化和反序列化一個(gè)對(duì)象,jvm會(huì)給我們創(chuàng)建一個(gè)單獨(dú)的對(duì)象。在反序列化時(shí),jvm創(chuàng)建對(duì)象并不會(huì)調(diào)用任何構(gòu)造函數(shù)。
為了反序列化一個(gè)對(duì)象,我們需要讓我們的類實(shí)現(xiàn)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;

我們從上面的字節(jié)碼片段可以看到,除了第1個(gè)方法,其他4個(gè)方法全都轉(zhuǎn)變?yōu)?/SPAN>invokevirtual(創(chuàng)建對(duì)象的直接方法),第一個(gè)方法轉(zhuǎn)變?yōu)閮蓚(gè)調(diào)用,newinvokespecial(構(gòu)造函數(shù)調(diào)用)。

例子

讓我們看一看為下面這個(gè)Employee類創(chuàng)建對(duì)象:

 

 

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種方式創(chuàng)建Employee對(duì)象。你可以從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());

    }

}

 

 

程序會(huì)輸出:

 

 

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

 

 

 

 

 

·上篇文章:線性表
·下篇文章:關(guān)于面向?qū)ο笠约叭筇卣鞯慕忉?/a>
復(fù)制 】 【 打印
 相關(guān)文章
沒有相關(guān)文章
特別聲明:本站除部分特別聲明禁止轉(zhuǎn)載的專稿外的其他文章可以自由轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處和原始作者。文章版權(quán)歸文章原始作者所有。對(duì)于被本站轉(zhuǎn)載文章的個(gè)人和網(wǎng)站,我們表示深深的謝意。如果本站轉(zhuǎn)載的文章有版權(quán)問題請(qǐng)聯(lián)系我們,我們盡快予以更正,謝謝。
關(guān)于我們 | 業(yè)務(wù)范圍 | 免責(zé)聲明 | 聯(lián)系我們 | 友情連接
版權(quán)所有 Copyright © 2007 【卓安特保-您身邊的護(hù)衛(wèi)專家】山東卓安安防工程有限公司,電話13361029977 All Rights Reserved.
魯ICP備11024361號(hào)-5    頁面執(zhí)行時(shí)間:23.44MS
www.黄色一级片美女按摩 | 日本人妻人人人澡人人爽 | 绿帽人妻精品一区二区 | 亚洲午夜精品一级毛片无码 | 成人无码做爰www欧美粉嫩 | 久久久 成人网站免费观看 亚洲黑人性猛交AAA毛片 | 蜜臀av性久久久久av | 内射无码专区久久亚洲 | 91人妻人人澡人人爽人人精品一 | 午夜成人精品电影一区 | A片婬妇色费AAA片看 | 亚洲一区二区无码成人AV | 蜜桃臀91成人无码精品 | 精品一区二区在线视频 | 四川野外少妇极品BBB | 免费 无码 国产在线 | 丰满人妻熟妇乱精品视频 | 韩国无码精品久久久 | 国产精品成人一区二区 | Chinese熟女熟妇2乱农村 | 99re久久国产 | 色婷婷视频在线观看 | 无码视频一区二区三区四区五区六区 | 国家一级无码视频 | 无码精品一区二区三区四区爱奇艺 | 中文字幕国产在线 | 91 国产 爽 黄 在线 | 夜夜夜无码一区二区三区 | 亚洲精品久久久一二区三区蜜桃av | 久久屈辱人妻少妇av | 姝姝窝人体www聚色窝 | 精品久久成人AV | 97在线无码精品秘 入口竹菊-百度 | 精品国产av一区二区三区 | 波多野结衣高潮狂喷hd玲奈 | 特级西西人体WWWw高清大胆 | 91熟女丨老女人 | 少妇大战黑人无套A片 | 国产精品一区二区在线免费观看 | 在线亚洲一区二区 | 日韩精品A片一区二区三区妖精 |