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
狼友视频在线观看污 | 美女自慰高潮喷射黑丝 | 亚洲无码专区在线观看 | 又嫩又硬又黄又爽的视频 | 欧美人与性口牲恔配视频大全 | 国产人妻人伦AV片三A级做爰 | 久久久亚洲AV成人无码www | 9999一区二区在线观看 | 动漫美女爆 羞羞动漫在线蜜桃 | 粉嫩小仙女高潮喷水 | 九九女厕偷拍精品视频 | 91精品无码少妇一区 | 人妻少妇看A偷人无码精品 精品中文字幕久久久久人妻 | 亚洲成人在线一区 | 国产偷人妻精品19p 糟蹋人妻HD中文字幕 | 亚洲色婷婷综合久久久久中文 | 国产又粗又大又黄又爽 | 蜜桃AV鲁一鲁一鲁一鲁俄罗斯的 | 91蜜桃在线观看 | 日韩无码视频专区 | 欧美乱做爱xxxⅹ久久久 | 人妻丰满熟妇av无码久久奶水 | 日本人妻人人人澡人人爽 | 无码国产伦一区二区三区视频 | 成人免费一区二区三区视频 | 欧美一级姪片A片 | 性一交一乱一色一视频麻豆 | 亚洲AV无码乱码精品国产app | 成人午夜A片999影视 | 九色丨老熟女丨91啦 | 99国精产品一区二区三区A片 | 親子近親相姦大亂交 | 国产又黄又爽在线 | 成人无码中文字幕 | 人妻少妇无码精品视频区 | 亚洲无码av在线观看 | 兰州老熟女露脸88AV | 国产精品aⅴ久久久久久鸭绿欲 | 91丨国产丨白浆秘 喷水 | 99国精产品一区二区三区A片 | 家庭乱妇国产国产传媒 |