public class Customer implements Cloneable
{
private String name;
private int age;
public Customer()
{
this("unknown", 0);
System.out.println("默認(rèn)的構(gòu)造方法");
}
public Customer(String name, int age)
{
this.name = name;
this.age = age;
System.out.println("the second constructor");
}
public Object clone()throws
{
return super.clone();
}
public boolean equals(Object o)
{
if(this==o) return true;
if(! (o instanceof Customer))
return false;
Customer c = (Customer)o;
if(this.name.equals(c.name) && this.age==c.age)
return true;
else
return false;
}
public String toString()
{
return "name="+name+",age="+age;
}
public static void main(String[] args)throws Exception
{
//運(yùn)用new語句創(chuàng)建對(duì)象
Customer c1 = new Customer("7Lde",30);
System.out.println("c1: "+c1);
//運(yùn)用反射手段獲得Customer對(duì)象
Class objClass = Class.forName("Customer");
Customer c2 = (Customer)objClass.newInstance();
System.out.println("c1: "+c1);
//運(yùn)用克隆手段獲得Customer對(duì)象
Customer c3 = (Customer)c1.clone();
System.out.println("c1==c3: "+ (c1==c3));
System.out.println("c1.equals(c3): "+ (c1.equals(c3)));
System.out.println("c3: "+ c3);
}
}
作為java開發(fā)者,我們每天創(chuàng)建很多對(duì)象,但是我們通常使用依賴注入的方式管理系統(tǒng),比如:Spring去創(chuàng)建對(duì)象,然而這里有很多創(chuàng)建對(duì)象的方法:使用New關(guān)鍵字、使用Class類的newInstance方法、使用Constructor類的newInstance方法、使用Clone方法、使用反序列化。
使用new關(guān)鍵字:這是我們最常見的也是最簡(jiǎn)單的創(chuàng)建對(duì)象的方式,通過這種方式我們還可以調(diào)用任意的夠贊函數(shù)(無參的和有參的)。比如:Student student = new Student();使用Class類的newInstance方法:我們也可以使用Class類的newInstance方法創(chuàng)建對(duì)象,這個(gè)newInstance方法調(diào)用無參的構(gòu)造器創(chuàng)建對(duì)象,如:Student student2 = (Student)Class.forName("根路徑.Student").newInstance(); 或者:Student stu = Student.class.newInstance();使用Constructor類的newInstance方法:次方法和Class類的newInstance方法很像,java.lang.relect.Constructor類里也有一個(gè)newInstance方法可以創(chuàng)建對(duì)象。
我們可以通過這個(gè)newInstance方法調(diào)用有參數(shù)的和私有的構(gòu)造函數(shù)。如: Constructor constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 這兩種newInstance的方法就是大家所說的反射,事實(shí)上Class的newInstance方法內(nèi)部調(diào)用Constructor的newInstance方法。
這也是眾多框架Spring、Hibernate、Struts等使用后者的原因。使用Clone的方法:無論何時(shí)我們調(diào)用一個(gè)對(duì)象的clone方法,JVM就會(huì)創(chuàng)建一個(gè)新的對(duì)象,將前面的對(duì)象的內(nèi)容全部拷貝進(jìn)去,用clone方法創(chuàng)建對(duì)象并不會(huì)調(diào)用任何構(gòu)造函數(shù)。
要使用clone方法,我們必須先實(shí)現(xiàn)Cloneable接口并實(shí)現(xiàn)其定義的clone方法。如:Student stu2 = stu.clone();使用反序列化:當(dāng)我們序列化和反序列化一個(gè)對(duì)象,JVM會(huì)給我們創(chuàng)建一個(gè)單獨(dú)的對(duì)象,在反序列化時(shí),JVM創(chuàng)建對(duì)象并不會(huì)調(diào)用任何構(gòu)造函數(shù)。
為了反序列化一個(gè)對(duì)象,我們需要讓我們的類實(shí)現(xiàn)Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();。
創(chuàng)建Object 實(shí)例的方式有兩種。第一種是使用new 操作符后跟Object 構(gòu)造函數(shù),如下所示:
var person = new Object();
person.name = "Nicholas";
person.age = 29;另一種方式是使用對(duì)象字面量表示法。對(duì)象字面量是對(duì)象定義的一種簡(jiǎn)寫形式,目的在于簡(jiǎn)化創(chuàng)建包含大量屬性的對(duì)象的過程。下面這個(gè)例子就使用了對(duì)象字面量語法定義了與前面那個(gè)例子中相同的person 對(duì)象:
var person = {
name : "Nicholas",
age : 29
};
使用new關(guān)鍵字:這是我們最常見的也是最簡(jiǎn)單的創(chuàng)建對(duì)象的方式,通過這種方式我們還可以調(diào)用任意的夠贊函數(shù)(無參的和有參的)。比如:Student student = new Student();
使用Class類的newInstance方法:我們也可以使用Class類的newInstance方法創(chuàng)建對(duì)象,這個(gè)newInstance方法調(diào)用無參的構(gòu)造器創(chuàng)建對(duì)象,如:Student student2 = (Student)Class.forName("根路徑.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
使用Constructor類的newInstance方法:本方法和Class類的newInstance方法很像,java.lang.relect.Constructor類里也有一個(gè)newInstance方法可以創(chuàng)建對(duì)象。我們可以通過這個(gè)newInstance方法調(diào)用有參數(shù)的和私有的構(gòu)造函數(shù)。如: Constructor<Student> constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 這兩種newInstance的方法就是大家所說的反射,事實(shí)上Class的newInstance方法內(nèi)部調(diào)用Constructor的newInstance方法。這也是眾多框架Spring、Hibernate、Struts等使用后者的原因。
使用Clone的方法:無論何時(shí)我們調(diào)用一個(gè)對(duì)象的clone方法,JVM就會(huì)創(chuàng)建一個(gè)新的對(duì)象,將前面的對(duì)象的內(nèi)容全部拷貝進(jìn)去,用clone方法創(chuàng)建對(duì)象并不會(huì)調(diào)用任何構(gòu)造函數(shù)。要使用clone方法,我們必須先實(shí)現(xiàn)Cloneable接口并實(shí)現(xiàn)其定義的clone方法。如:Student stu2 = <Student>stu.clone();這也是原型模式的應(yīng)用。
使用反序列化:當(dāng)我們序列化和反序列化一個(gè)對(duì)象,JVM會(huì)給我們創(chuàng)建一個(gè)單獨(dú)的對(duì)象,在反序列化時(shí),JVM創(chuàng)建對(duì)象并不會(huì)調(diào)用任何構(gòu)造函數(shù)。為了反序列化一個(gè)對(duì)象,我們需要讓我們的類實(shí)現(xiàn)Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();
可以參考如下內(nèi)容:第一種模式:工廠方式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ var Child = new Object(); Child.name="李小龍"; Child.age="30"; Child.lev=lev; return Child; }; var x = Parent(); alert(x.name); alert(x.lev()); 說明:1.在函數(shù)中定義對(duì)象,并定義對(duì)象的各種屬性,,雖然屬性可以為方法,但是建議將屬性為方法的屬性定義到函數(shù)之外,這樣可以避免重復(fù)創(chuàng)建該方法2.引用該對(duì)象的時(shí)候,這里使用的是 var x = Parent()而不是 var x = new Parent();因?yàn)楹笳邥?huì)可能出現(xiàn)很多問題(前者也成為工廠經(jīng)典方式,后者稱之為混合工廠方式),不推薦使用new的方式使用該對(duì)象3.在函數(shù)的最后返回該對(duì)象4.不推薦使用這種方式創(chuàng)建對(duì)象,但應(yīng)該了解第二種模式:構(gòu)造函數(shù)方式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ this.name="李小龍"; this.age="30"; this.lev=lev; }; var x =new Parent(); alert(x.name); alert(x.lev()); 說明:1.與工廠方式相比,使用構(gòu)造函數(shù)方式創(chuàng)建對(duì)象,無需再函數(shù)內(nèi)部重建創(chuàng)建對(duì)象,而使用this指代,并而函數(shù)無需明確return2.同工廠模式一樣,雖然屬性的值可以為方法,扔建議將該方法定義在函數(shù)之外3..同樣的,不推薦使用這種方式創(chuàng)建對(duì)象,但仍需要了解第3種模式:原型模式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ }; Parent.prototype.name="李小龍"; Parent.prototype.age="30"; Parent.prototype.lev=lev; var x =new Parent(); alert(x.name); alert(x.lev());。
創(chuàng)建出來的對(duì)象沒有任何區(qū)別,但是第一種寫法體現(xiàn)了Java的面向接口編程的原則,而第二種是面向?qū)崿F(xiàn)編程。使用第一種方法,如果以后想把ArrayList替換成LinkedList只需要修改new后面的對(duì)象即可,而第二種方式還需要修改它的聲明類型。
擴(kuò)展一下,如果你又創(chuàng)建了一個(gè)list3,list3中包含的也是List類型,兩種方式
方式1: List<List<int>> list3 = 。.
方式2: List<ArrayList<int>> list3 = 。
如果使用的是方式2 而且你把list1改成了LinkedList后 你就不能把list1放入到list3里面
但是如果你使用方式1 無論你把list1改成哪種List 都不用修改list3的創(chuàng)建方式
Java中創(chuàng)建對(duì)象的四種方式 1.用new語句創(chuàng)建對(duì)象,這是最常見的創(chuàng)建對(duì)象的方法。
2.運(yùn)用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實(shí)例方法。 3.調(diào)用對(duì)象的clone()方法。
4.運(yùn)用反序列化手段,調(diào)用java.io.ObjectInputStream對(duì)象的 readObject()方法。下面演示了用前面3種方式創(chuàng)建對(duì)象的過程:public class Customer implements Cloneable{ private String name; private int age; public Customer(){ this("unknown",0); System.out.println("call default constructor"); } public Customer(String name,int age){ this.name=name; this.age=age; System.out.println("call second constructor"); } public Object clone()throws { return super.clone(); } public boolean equals(Object o){ if(this==o)return true; if(! (o instanceof Customer)) return false; final Customer other=(Customer)o; if(this.name.equals(other.name) && this.age==other.age) return true; else return false; } public String toString(){ return "name="+name+",age="+age; } public static void main(String args[])throws Exception{//運(yùn)用反射手段創(chuàng)建Customer對(duì)象 Class objClass=Class.forName("Customer"); Customer c1=(Customer)objClass.newInstance(); //會(huì)調(diào)用Customer類的默認(rèn)構(gòu)造方法 System.out.println("c1: "+c1); //打印name=unknown,age=0//用new語句創(chuàng)建Customer對(duì)象 Customer c2=new Customer("Tom",20); System.out.println("c2: "+c2); //打印name=tom,age=20//運(yùn)用克隆手段創(chuàng)建Customer對(duì)象 Customer c3=(Customer)c2.clone(); //不會(huì)調(diào)用Customer類的構(gòu)造方法 System.out.println("c2==c3 : "+(c2==c3)); //打印false System.out.println("c2.equals(c3) : "+c2.equals(c3)); //打印true System.out.println("c3: "+c3); //打印name=tom,age=20 } } 除了以上4種顯式地創(chuàng)建對(duì)象的方式以外,在程序中還可以隱含地創(chuàng)建對(duì)象,包括以下幾種情況:1.對(duì)于java命令中的每個(gè)命令行參數(shù),Java虛擬機(jī)都會(huì)創(chuàng)建相應(yīng)的String對(duì)象,并把它們組織到一個(gè)String數(shù)組中,再把該數(shù)組作為參數(shù)傳給程序入口main(String args[])方法。
2.程序代碼中的String類型的直接數(shù)對(duì)應(yīng)一個(gè)String對(duì)象。3.字符串操作符“+”的運(yùn)算結(jié)果為一個(gè)新的String對(duì)象。
4.當(dāng)Java虛擬機(jī)加載一個(gè)類時(shí),會(huì)隱含地創(chuàng)建描述這個(gè)類的Class實(shí)例.。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時(shí)間:3.404秒