国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中五種不同方法的創建對象

Java中五種不同方法的創建對象

2020-05-31 13:05daisy JAVA教程

本文為大家詳細介紹了在Java中5種不同創建對象的方法和實例代碼,感興趣的小伙伴們可以參考一下

前言

作為Java開發者,我們每天都會創建大量的對象,但是,我們總是使用管理依賴系統(如Spring框架)來創建這些對象。其實還有其他方法可以創建對象,在接下來的文章中我會進行詳細介紹。

1.使用new關鍵字

這是最常見的創建對象的方法,并且也非常簡單。通過使用這種方法我們可以調用任何我們需要調用的構造函數。

?
1
2
3
4
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() 用以下方式創建對象:

?
1
Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();

或者

?
1
2
Employee emp2 = Employee.class.newInstance();
51: invokevirtual  #70  // Method java/lang/Class.newInstance:()Ljava/lang/Object;

3.使用構造函數類的 newInstance方法

與使用class類的newInstance方法相似,java.lang.reflect.Constructor類中有一個可以用來創建對象的newInstance()函數方法。通過使用這個newInstance方法我們也可以調用參數化構造函數和私有構造函數。

?
1
2
3
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() 方法被認為是創建對象的反射手段。實際上,內部類的newInstance()方法使用構造函數類的 newInstance() 方法。這就是為什么后者是首選并且使用不同的框架如Spring, Hibernate, Struts等。

4.使用clone方法

實際上無論何時我們調用clone方法,JAVA虛擬機都為我們創建了一個新的對象并且復制了之前對象的內容到這個新的對象中。使用 clone方法創建對象不會調用任何構造函數。

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

?
1
2
Employee emp4 = (Employee) emp3.clone();
162: invokevirtual #87 // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;

5.使用反序列化

無論何時我們對一個對象進行序列化和反序列化,JAVA虛擬機都會為我們創建一個單獨的對象。在反序列化中,JAVA虛擬機不會使用任何構造函數來創建對象。

對一個對象進行序列化需要我們在類中實現可序列化的接口。

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

正如我們在以上的字節代碼片段中所看到的,除第一種被轉換為一個新的函數和一個 invokespecial 指令以外,其它4種方法都被調用并轉換為invokevirtual

示例

讓我們來看看準備創建對象的 Employee 類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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對象。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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());
  }
}

此程序輸出結果如下:

?
1
2
3
4
5
6
7
8
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創建對象的5種不同方法,希望給大家學習java時有所幫助。也謝謝大家對服務器之家的支持。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人久久精品麻豆二区 | 在线精品一区 | 人人干天天干 | 国产情侣免费视频 | 亚洲精品在线播放 | 国产精品视频入口 | 午夜小视频在线观看 | 欧美成人激情视频 | 国产美女视频网站 | 久久久区 | 日韩国产精品一区二区三区 | 亚洲九九 | 草草浮力影院 | 精品久久久久久久久久久久 | 精品久久久久久亚洲综合网 | 欧美一区二区三区在线观看视频 | 亚洲精品在线视频观看 | 91精品国产综合久久福利软件 | 日日摸夜夜 | 亚洲 精品 综合 精品 自拍 | jizzzz中国 | 亚洲男女视频在线观看 | 中文字幕在线免费视频 | www国产亚洲精品久久网站 | 久久久久国产精品午夜一区 | 精品国产不卡一区二区三区 | 一二三区字幕免费观看av | 亚洲精品久久久 | 黄色午夜 | 中国黄色免费网站 | 91xxx在线观看 | 亚洲精品成人18久久久久 | 免费视频一区二区 | 国产精品视频久久 | 成人一区电影 | 亚洲成人综合网站 | 色婷婷在线视频观看 | 久久激情久久 | 超碰日韩 | 久久成人国产精品 | 欧美一区二区最爽乱淫视频免费看 |