public class Customer implements Cloneable
{
private String name;
private int age;
public Customer()
{
this("unknown", 0);
System.out.println("默認的構造方法");
}
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
{
//運用new語(yǔ)句創(chuàng )建對象
Customer c1 = new Customer("7Lde",30);
System.out.println("c1: "+c1);
//運用反射手段獲得Customer對象
Class objClass = Class.forName("Customer");
Customer c2 = (Customer)objClass.newInstance();
System.out.println("c1: "+c1);
//運用克隆手段獲得Customer對象
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開(kāi)發(fā)者,我們每天創(chuàng )建很多對象,但是我們通常使用依賴(lài)注入的方式管理系統,比如:Spring去創(chuàng )建對象,然而這里有很多創(chuàng )建對象的方法:使用New關(guān)鍵字、使用Class類(lèi)的newInstance方法、使用Constructor類(lèi)的newInstance方法、使用Clone方法、使用反序列化。
使用new關(guān)鍵字:這是我們最常見(jiàn)的也是最簡(jiǎn)單的創(chuàng )建對象的方式,通過(guò)這種方式我們還可以調用任意的夠贊函數(無(wú)參的和有參的)。比如:Student student = new Student();使用Class類(lèi)的newInstance方法:我們也可以使用Class類(lèi)的newInstance方法創(chuàng )建對象,這個(gè)newInstance方法調用無(wú)參的構造器創(chuàng )建對象,如:Student student2 = (Student)Class.forName("根路徑.Student").newInstance(); 或者:Student stu = Student.class.newInstance();使用Constructor類(lèi)的newInstance方法:次方法和Class類(lèi)的newInstance方法很像,java.lang.relect.Constructor類(lèi)里也有一個(gè)newInstance方法可以創(chuàng )建對象。
我們可以通過(guò)這個(gè)newInstance方法調用有參數的和私有的構造函數。如: Constructor constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 這兩種newInstance的方法就是大家所說(shuō)的反射,事實(shí)上Class的newInstance方法內部調用Constructor的newInstance方法。
這也是眾多框架Spring、Hibernate、Struts等使用后者的原因。使用Clone的方法:無(wú)論何時(shí)我們調用一個(gè)對象的clone方法,JVM就會(huì )創(chuàng )建一個(gè)新的對象,將前面的對象的內容全部拷貝進(jìn)去,用clone方法創(chuàng )建對象并不會(huì )調用任何構造函數。
要使用clone方法,我們必須先實(shí)現Cloneable接口并實(shí)現其定義的clone方法。如:Student stu2 = stu.clone();使用反序列化:當我們序列化和反序列化一個(gè)對象,JVM會(huì )給我們創(chuàng )建一個(gè)單獨的對象,在反序列化時(shí),JVM創(chuàng )建對象并不會(huì )調用任何構造函數。
為了反序列化一個(gè)對象,我們需要讓我們的類(lèi)實(shí)現Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();。
使用new關(guān)鍵字:這是我們最常見(jiàn)的也是最簡(jiǎn)單的創(chuàng )建對象的方式,通過(guò)這種方式我們還可以調用任意的夠贊函數(無(wú)參的和有參的)。比如:Student student = new Student();
使用Class類(lèi)的newInstance方法:我們也可以使用Class類(lèi)的newInstance方法創(chuàng )建對象,這個(gè)newInstance方法調用無(wú)參的構造器創(chuàng )建對象,如:Student student2 = (Student)Class.forName("根路徑.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
使用Constructor類(lèi)的newInstance方法:本方法和Class類(lèi)的newInstance方法很像,java.lang.relect.Constructor類(lèi)里也有一個(gè)newInstance方法可以創(chuàng )建對象。我們可以通過(guò)這個(gè)newInstance方法調用有參數的和私有的構造函數。如: Constructor<Student> constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 這兩種newInstance的方法就是大家所說(shuō)的反射,事實(shí)上Class的newInstance方法內部調用Constructor的newInstance方法。這也是眾多框架Spring、Hibernate、Struts等使用后者的原因。
使用Clone的方法:無(wú)論何時(shí)我們調用一個(gè)對象的clone方法,JVM就會(huì )創(chuàng )建一個(gè)新的對象,將前面的對象的內容全部拷貝進(jìn)去,用clone方法創(chuàng )建對象并不會(huì )調用任何構造函數。要使用clone方法,我們必須先實(shí)現Cloneable接口并實(shí)現其定義的clone方法。如:Student stu2 = <Student>stu.clone();這也是原型模式的應用。
使用反序列化:當我們序列化和反序列化一個(gè)對象,JVM會(huì )給我們創(chuàng )建一個(gè)單獨的對象,在反序列化時(shí),JVM創(chuàng )建對象并不會(huì )調用任何構造函數。為了反序列化一個(gè)對象,我們需要讓我們的類(lèi)實(shí)現Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();
可以參考如下內容:第一種模式:工廠(chǎng)方式[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()); 說(shuō)明:1.在函數中定義對象,并定義對象的各種屬性,,雖然屬性可以為方法,但是建議將屬性為方法的屬性定義到函數之外,這樣可以避免重復創(chuàng )建該方法2.引用該對象的時(shí)候,這里使用的是 var x = Parent()而不是 var x = new Parent();因為后者會(huì )可能出現很多問(wèn)題(前者也成為工廠(chǎng)經(jīng)典方式,后者稱(chēng)之為混合工廠(chǎng)方式),不推薦使用new的方式使用該對象3.在函數的最后返回該對象4.不推薦使用這種方式創(chuàng )建對象,但應該了解第二種模式:構造函數方式[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()); 說(shuō)明:1.與工廠(chǎng)方式相比,使用構造函數方式創(chuàng )建對象,無(wú)需再函數內部重建創(chuàng )建對象,而使用this指代,并而函數無(wú)需明確return2.同工廠(chǎng)模式一樣,雖然屬性的值可以為方法,扔建議將該方法定義在函數之外3..同樣的,不推薦使用這種方式創(chuàng )建對象,但仍需要了解第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 )建Object 實(shí)例的方式有兩種。第一種是使用new 操作符后跟Object 構造函數,如下所示:
var person = new Object();
person.name = "Nicholas";
person.age = 29;另一種方式是使用對象字面量表示法。對象字面量是對象定義的一種簡(jiǎn)寫(xiě)形式,目的在于簡(jiǎn)化創(chuàng )建包含大量屬性的對象的過(guò)程。下面這個(gè)例子就使用了對象字面量語(yǔ)法定義了與前面那個(gè)例子中相同的person 對象:
var person = {
name : "Nicholas",
age : 29
};
Java中創(chuàng )建對象的四種方法 收藏Java中創(chuàng )建對象的四種方式
1.用new語(yǔ)句創(chuàng )建對象,這是最常見(jiàn)的創(chuàng )建對象的方法。
2.運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類(lèi)的newInstance()實(shí)例方法。
3.調用對象的clone()方法。
4.運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。
第一種最常見(jiàn)
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據《信息網(wǎng)絡(luò )傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個(gè)月內通知我們,我們會(huì )及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習?shū)B(niǎo). 頁(yè)面生成時(shí)間:3.029秒