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

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

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

  文章作者:網(wǎng)絡(luò)來(lái)源:網(wǎng)絡(luò)轉(zhuǎn)摘瀏覽次數(shù):7824字體:字體顏色
 閱讀權(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開(kāi)發(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方法

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

使用反序列化

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

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

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

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

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

4.使用clone方法

無(wú)論何時(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)文章
沒(méi)有相關(guān)文章
特別聲明:本站除部分特別聲明禁止轉(zhuǎn)載的專稿外的其他文章可以自由轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處和原始作者。文章版權(quán)歸文章原始作者所有。對(duì)于被本站轉(zhuǎn)載文章的個(gè)人和網(wǎng)站,我們表示深深的謝意。如果本站轉(zhuǎn)載的文章有版權(quán)問(wè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    頁(yè)面執(zhí)行時(shí)間:7.81MS
亚洲欧洲精品一区 | 三色黄A片免费播放 | 中文字幕一区二区三区四区50岁 | 成人3D动漫天堂久久久 | 蜜桃视频在线播放一区 | 亚洲国产精品久久无码在 | 婷婷五月天激情视频 | 精品少妇嫩草aⅴ凸凹视频 特级毛片AAAAAA蜜桃 | 日韩一二三区无码 | 亚洲一区二区三区四区在线 | 欧美综合激情啪啪 | 午夜情侣毛片91视频 | 91精品人妻一区二区三区浪潮 | 91精品国产综合久久久夜色撩人 | 成人免费XXXXXX视频 | 18av在线播放| 国产无码高清电影 | 国产熟女乱子伦露脸视频com | 亚洲国产成人精品综合 | 国产精品成人三级 | 色欲AV无码在线观看 | 欧美精品一区二区成人 | 69精品无码成人久久久久久 | 蜜桃视频 在线观看免费 | 黄色小电影在线观看 | 无码欧美精品一区二区蜜桃色欲 | 免费无码婬片AAAA片直播色戒 | 国产AV无码专区亚洲A∨毛片 | 韩日无码一区二区 | 成人午夜免费无码福利软件 | 国产无码免费在线 | 亚洲精品蜜桃在线观看视频 | 国产传媒中文字幕 | 少妇啪啪又爽又紧又爽麻豆 | 欧美成人在线影院 | 人人妻人人澡人人爽人人爱 | 青青爽精品视频在线观看 | 亚洲精品欧美精品 | 精品无码av毛片一区二区三区 | 午夜免费视频在线 | 色天堂在线观看www 白嫩少妇激情无码久久 |