標籤: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對象,例如:
- String s1="Hello";
- String s2="Hello"; //s2和s1引用同一個String對象
- String s3=new String("Hello");
- System.out.println(s1==s2); //列印true
- System.out.println(s1==s3); //列印false
執行完以上程式,記憶體中實際上只有兩個String對象,一個是直接數,由Java虛擬機器隱含地建立,還有一個通過new語句顯式地建立。
3.字串操作符“+”的運算結果為一個新的String對象。例如:
- String s1="H";
- String s2=" ello";
- String s3=s1+s2; //s3引用一個新的String對象
- System.out.println(s3=="Hello"); //列印false
- 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中方法