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

來源:互聯網
上載者:User

標籤:win   介紹   cto   對象   記憶體   word   this   定義   unknown   

概述:本文介紹以下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中方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.