1. 程式人生 > >【學習筆記】Java中生成對象的5中方法

【學習筆記】Java中生成對象的5中方法

目標 獲得 cti com pre lan except 我們 highlight

概述:本文介紹以下java五種創建對象的方式:

1.用new語句創建對象,這是最常用的創建對象的方式。

2.使用Class類的newInstance方法

3.運用反射手段,調用java.lang.reflect.Constructor類的newInstance()實例方法。

4.調用對象的clone()方法。

5.運用反序列化手段,調用java.io.ObjectInputStream對象的readObject()方法.

一、使用new關鍵字

  這是最常見也是最簡單的創建對象的方式了。通過這種方式,我們可以調用任意的構造函數(無參的和帶參數的)。

二、使用Class類的newInstance方法

  使用Class類的newInstance方法創建對象。這個newInstance方法調用無參的構造函數創建對象

三、使用Constructor類的newInstance方法

  和Class類的newInstance方法很像, java.lang.reflect.Constructor類裏也有一個newInstance方法可以創建對象。我們可以通過這個newInstance方法調用有參數的和私有的構造函數。

  newInstance方法內部調用Constructor的newInstance方法。這也是眾多框架,如Spring、Hibernate、Struts等使用後者的原因。

四、使用clone方法

  無論何時我們調用一個對象的clone方法,jvm就會創建一個新的對象,將前面對象的內容全部拷貝進去。用clone方法創建對象並不會調用任何構造函數。

要使用clone方法,我們需要先實現Cloneable接口並實現其定義的clone方法。

 1 public class Customer implements Cloneable{  
 2 private String name;  
 3 private int age;  
 4 public Customer(){  
 5   this("unknown",0);  
 6   System.out.println("call default constructor");  
7 } 8 public Customer(String name,int age){ 9 this.name=name; 10 this.age=age; 11 System.out.println("call second constructor"); 12 } 13 public Object clone()throws CloneNotSupportedException{ 14 return super.clone(); 15 } 16 public boolean equals(Object o){ 17 if(this==o)return true; 18 if(! (o instanceof Customer)) return false; 19 final Customer other=(Customer)o; 20 if(this.name.equals(other.name) && this.age==other.age) 21 return true; 22 else 23 return false; 24 } 25 public String toString(){ 26 return "name="+name+",age="+age; 27 } 28 public static void main(String args[])throws Exception{ 29 //運用反射手段創建Customer對象 30 Class objClass=Class.forName("Customer"); 31 Customer c1=(Customer)objClass.newInstance(); //會調用Customer類的默認構造方法 32 System.out.println("c1: "+c1); //打印name=unknown,age=0 33 34 //用new語句創建Customer對象 35 Customer c2=new Customer("Tom",20); 36 System.out.println("c2: "+c2); //打印name=tom,age=20 37 38 //運用克隆手段創建Customer對象 39 Customer c3=(Customer)c2.clone(); //不會調用Customer類的構造方法 40 System.out.println("c2==c3 : "+(c2==c3)); //打印false 41 System.out.println("c2.equals(c3) : "+c2.equals(c3)); //打印true 42 System.out.println("c3: "+c3); //打印name=tom,age=20 43 } 44 }

五、使用反序列化

  當我們序列化和反序列化一個對象,jvm會給我們創建一個單獨的對象。在反序列化時,jvm創建對象並不會調用任何構造函數。

為了反序列化一個對象,我們需要讓我們的類實現Serializable接口。

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp = (Employee) in.readObject();

註意:除了第1個方法,其他4個方法全都轉變為invokevirtual(創建對象的直接方法),第一個方法轉變為兩個調用,new和invokespecial(構造函數調用)。

除了以上5種顯式地創建對象的方式以外,在程序中還可以隱含地創建對象,包括以下幾種情況:

1.對於java命令中的每個命令行參數,Java虛擬機都會創建相應的String對象,並把它們組織到一個String數組中,再把該數組作為參數傳給程序入口main(String args[])方法。

2.程序代碼中的String類型的直接數對應一個String對象,例如:

  1. String s1="Hello";
  2. String s2="Hello"; //s2和s1引用同一個String對象
  3. String s3=new String("Hello");
  4. System.out.println(s1==s2); //打印true
  5. System.out.println(s1==s3); //打印false

執行完以上程序,內存中實際上只有兩個String對象,一個是直接數,由Java虛擬機隱含地創建,還有一個通過new語句顯式地創建。

3.字符串操作符“+”的運算結果為一個新的String對象。例如:

  1. String s1="H";
  2. String s2=" ello";
  3. String s3=s1+s2; //s3引用一個新的String對象
  4. System.out.println(s3=="Hello"); //打印false
  5. System.out.println(s3.equals("Hello")); //打印true

4.當Java虛擬機加載一個類時,會隱含地創建描述這個類的Class實例.

參考資料:

java中生成對象的方式有多種,如下所示:

1、使用new操作符,這是最普遍的一種 如:String s=new String("abc"); 2、使用反射動態生成 利用Class,ClassLoader,Constructor中的方法可以動態的生成類實例 如:Object o=Class.forName("java.lang.String").newInstance(); Object o=String.class.getClassLoader.loadClass("java.lang.String").newInstance(); 以上的方式需要目標類擁有公有無參構造函數 以下使用Constructor進行動態生成 class User{ public User(String user,Integer id){} } Constructor c=User.class.getConstructor(new Class[]{String.class,Integer.class}); User user=(User)c.newInstance(new Object[]{"zhang san",123}); 3、使用克隆生成對象 例如使用一個實現了Cloneable接口的對象,調用其clone()方法獲得該對象的一份拷貝 4、利用反序列化從流中生成對象 利用ObjectInptuStream的readObject()方法生成對象

【學習筆記】Java中生成對象的5中方法