国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Bmob / 2364人閱讀

摘要:使用關(guān)鍵字這是最常見(jiàn)的創(chuàng)建對(duì)象的方法,并且也非常簡(jiǎn)單。我們可以通過(guò)用以下方式創(chuàng)建對(duì)象或者使用構(gòu)造函數(shù)類的方法與使用類的方法相似,類中有一個(gè)可以用來(lái)創(chuàng)建對(duì)象的函數(shù)方法。在反序列化中,虛擬機(jī)不會(huì)使用任何構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象。

作為Java開(kāi)發(fā)者,我們每天都會(huì)創(chuàng)建大量的對(duì)象,但是,我們總是使用管理依賴系統(tǒng)(如Spring框架)來(lái)創(chuàng)建這些對(duì)象。其實(shí)還有其他方法可以創(chuàng)建對(duì)象,在接下來(lái)的文章中我會(huì)進(jìn)行詳細(xì)介紹。

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

這是最常見(jiàn)的創(chuàng)建對(duì)象的方法,并且也非常簡(jiǎn)單。通過(guò)使用這種方法我們可以調(diào)用任何我們需要調(diào)用的構(gòu)造函數(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方法來(lái)創(chuàng)建對(duì)象。此newInstance方法調(diào)用無(wú)參構(gòu)造函數(shù)以創(chuàng)建對(duì)象。

我們可以通過(guò)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.使用構(gòu)造函數(shù)類的 newInstance方法

與使用class類的newInstance方法相似,java.lang.reflect.Constructor類中有一個(gè)可以用來(lái)創(chuàng)建對(duì)象的newInstance()函數(shù)方法。通過(guò)使用這個(gè)newInstance方法我們也可以調(diào)用參數(shù)化構(gòu)造函數(shù)和私有構(gòu)造函數(shù)。

Constructor constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();
111: invokevirtual  #80  // Method java/lang/reflect/Constructor.newInstance:([Ljava/lang/Object;)Ljava/lang/Object;

這些 newInstance() 方法被認(rèn)為是創(chuàng)建對(duì)象的反射手段。實(shí)際上,內(nèi)部類的newInstance()方法使用構(gòu)造函數(shù)類的 newInstance() 方法。這就是為什么后者是首選并且使用不同的框架如Spring, Hibernate, Struts等。

4.使用clone方法

實(shí)際上無(wú)論何時(shí)我們調(diào)用clone方法,JAVA虛擬機(jī)都為我們創(chuàng)建了一個(gè)新的對(duì)象并且復(fù)制了之前對(duì)象的內(nèi)容到這個(gè)新的對(duì)象中。使用 clone方法創(chuàng)建對(duì)象不會(huì)調(diào)用任何構(gòu)造函數(shù)。

為了在對(duì)象中使用clone()方法,我們需要在其中實(shí)現(xiàn)可克隆類型并定義clone方法。

Employee emp4 = (Employee) emp3.clone();
162: invokevirtual #87  // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;
5.使用反序列化

無(wú)論何時(shí)我們對(duì)一個(gè)對(duì)象進(jìn)行序列化和反序列化,JAVA虛擬機(jī)都會(huì)為我們創(chuàng)建一個(gè)多帶帶的對(duì)象。在反序列化中,JAVA虛擬機(jī)不會(huì)使用任何構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象。

對(duì)一個(gè)對(duì)象進(jìn)行序列化需要我們?cè)陬愔袑?shí)現(xiàn)可序列化的接口。

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();
261: invokevirtual  #118   // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;

正如我們?cè)谝陨系淖止?jié)代碼片段中所看到的,除第一種被轉(zhuǎn)換為一個(gè)新的函數(shù)和一個(gè) invokespecial 指令以外,其它4種方法都被調(diào)用并轉(zhuǎn)換為invokevirtual。

示例

讓我們來(lái)看看準(zhǔn)備創(chuàng)建對(duì)象的 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種方式來(lái)創(chuàng)建 Employee對(duì)象。

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 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());
    }
}

此程序輸出結(jié)果如下:

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

本文譯自:Dzone 譯者:慧都控件網(wǎng)-慧都小藝

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64968.html

相關(guān)文章

  • Java String類筆記

    摘要:這兩個(gè)操作符都是編譯器默認(rèn)引入了類,最后都調(diào)用方法返回對(duì)象,臨時(shí)對(duì)象被回收,因此效率極為低下 Java String類筆記 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處https://segmentfault.com/u/yzwall String的不可變性 String的不可變性 // String declaration public final class String ...

    Vicky 評(píng)論0 收藏0
  • JS中創(chuàng)對(duì)象設(shè)計(jì)模式

    摘要:構(gòu)造函數(shù)模式定義構(gòu)造函數(shù)模式是語(yǔ)言創(chuàng)建對(duì)象的通用方式。但兩種語(yǔ)言用構(gòu)造函數(shù)創(chuàng)建對(duì)象的方式略有不同在中沒(méi)有類的概念,函數(shù)即為一等公民,因此,不必顯式聲明某個(gè)類,直接創(chuàng)建構(gòu)造函數(shù)即可,類的方法和屬性在構(gòu)造函數(shù)中或原型對(duì)象上處理。 工廠模式 定義:工廠模式非常直觀,將創(chuàng)建對(duì)象的過(guò)程抽象為一個(gè)函數(shù),用函數(shù)封裝以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)。通俗地講,工廠模式就是將創(chuàng)建對(duì)象的語(yǔ)句放在一個(gè)函數(shù)里,通...

    Galence 評(píng)論0 收藏0
  • Java8中創(chuàng)Stream 流方式以及 Stream 中間操作

    摘要:一創(chuàng)建里流的四種方式第一種通過(guò)得方法串行流或者方法并行流創(chuàng)建。終止操作時(shí)一次性全部處理,稱為延遲加載篩選切片過(guò)濾中建操作。終止操作只有執(zhí)行終止操作才會(huì)執(zhí)行全部。即延遲加載結(jié)果中建操作。截?cái)嗔鳎蛊湓夭怀^(guò)給定數(shù)量。返回流中最大值。 Stream api **Stream api 是java8 中提供的對(duì)集合處理的api , 對(duì)數(shù)據(jù)進(jìn)行一系列的中間操作,元數(shù)據(jù)不會(huì)發(fā)生改變 ...

    0xE7A38A 評(píng)論0 收藏0
  • Java虛擬機(jī)中,字符串常量到底存放在哪

    摘要:的三種常量池此外,有三種常量池,即字符串常量池又叫全局字符串池文件常量池運(yùn)行時(shí)常量池。開(kāi)始虛擬機(jī)把字符串常量池位置從永久代挪到堆,又徹底取消,把諸如之類的元數(shù)據(jù)都挪到堆之外管理。 前言 前陣子和朋友討論一個(gè)問(wèn)題: 字符串常量歸常量池管理,那比如 String str = abc; abc這個(gè)對(duì)象是放在內(nèi)存中的哪個(gè)位置,是字符串常量池中還是堆? 這句代碼的abc當(dāng)然在常量池中,只有n...

    lewinlee 評(píng)論0 收藏0
  • 44個(gè)Java代碼性能優(yōu)化總結(jié)

    摘要:代碼優(yōu)化的最重要的作用應(yīng)該是避免未知的錯(cuò)誤。此舉能夠使性能平均提高。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象,接口的構(gòu)造函數(shù)調(diào)用名為的本地同步方法,方法檢查堆棧,收集調(diào)用跟蹤信息。異常只能用于錯(cuò)誤處理,不應(yīng)該用來(lái)控制程序流程。 showImg(https://segmentfault.com/img/remote/1460000015379073); 代碼優(yōu)化的最重要的作用應(yīng)該是:避免未知的錯(cuò)誤...

    YanceyOfficial 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<