Java中創(chuàng)建對象的四種方法 收藏Java中創(chuàng)建對象的四種方式
1.用new語句創(chuàng)建對象,這是最常見的創(chuàng)建對象的方法。
2.運(yùn)用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實(shí)例方法。
3.調(diào)用對象的clone()方法。
4.運(yùn)用反序列化手段,調(diào)用java.io.ObjectInputStream對象的 readObject()方法。
第一種最常見
使用new關(guān)鍵字:這是我們最常見的也是最簡單的創(chuàng)建對象的方式,通過這種方式我們還可以調(diào)用任意的夠贊函數(shù)(無參的和有參的)。比如:Student student = new Student();
使用Class類的newInstance方法:我們也可以使用Class類的newInstance方法創(chuàng)建對象,這個(gè)newInstance方法調(diào)用無參的構(gòu)造器創(chuàng)建對象,如:Student student2 = (Student)Class.forName("根路徑.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
使用Constructor類的newInstance方法:本方法和Class類的newInstance方法很像,java.lang.relect.Constructor類里也有一個(gè)newInstance方法可以創(chuàng)建對象。我們可以通過這個(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è)對象的clone方法,JVM就會(huì)創(chuàng)建一個(gè)新的對象,將前面的對象的內(nèi)容全部拷貝進(jìn)去,用clone方法創(chuàng)建對象并不會(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è)對象,JVM會(huì)給我們創(chuàng)建一個(gè)單獨(dú)的對象,在反序列化時(shí),JVM創(chuàng)建對象并不會(huì)調(diào)用任何構(gòu)造函數(shù)。為了反序列化一個(gè)對象,我們需要讓我們的類實(shí)現(xiàn)Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();
我大一的時(shí)候?qū)W過一學(xué)期的C,時(shí)間有點(diǎn)久了只能記住一點(diǎn)點(diǎn)。印象最深刻的就是開頭那個(gè)include。。.
說回來Java和C其實(shí)代碼風(fēng)格是很相似的。什么面向過程什么面向?qū)ο?,說起來很繞,甚至我剛工作時(shí)還是很迷糊,但是工作一段時(shí)間就能明白了。
java中的對象可以理解為數(shù)據(jù)存儲(chǔ)對象,比如說數(shù)據(jù)庫里有個(gè)person表,對應(yīng)的實(shí)體類一定要有一個(gè)person類,這個(gè)類里一般會(huì)有一些簡單屬性name,sex之類的。這些是每一個(gè)person都會(huì)有的,書上往往都會(huì)說“把大千世界看成一個(gè)個(gè)的對象”,這樣太繞你讀不懂就理解為數(shù)據(jù)庫person的每行都有name,sex字段。
至于方法,就是為person編寫的業(yè)務(wù)程序。你的代碼需要person有一個(gè)聽的功能,你就定義一個(gè) void say(),如果這個(gè)person什么都不用做,那就沒有方法。
在學(xué)習(xí)反射機(jī)制時(shí),總結(jié)一下獲得類對象方式:
第一種方式:通過類本身來獲得對象
Java代碼
Class classname =
this
.getClass();
第二種方式:通過子類的實(shí)例獲取父類對象
Java代碼
ClassName cn =
new
ClassName();
UserClass = cn.getClass();
Class SubUserClass = UserClass.getSuperclass();
第三種方式:通過類名加.class獲取對象
Java代碼
Class ForClass = **.**.ClassName.
class
;(類在包中的路徑加.
class
)
第四種方式:通過類名的字符串獲取對象
Java代碼
Class ForName = Class.forName(
"**.**.ClassName"
);
類是對一類事物的描述。如“人”就是一個(gè)類,一個(gè)類又有很多屬性和方法,如“人”有“名字”,“性別”“年齡”等屬性,有“行走”,“說話”等方法。說簡單點(diǎn)就是屬性描述一個(gè)類是什么樣的,而方法描述一個(gè)類能干什么。我們說創(chuàng)建一個(gè)類,就是寫一個(gè)Java類,如
class Person{//類
String name;。.//屬性
public void run(){..}//方法
}
而對象是類的一個(gè)實(shí)例,如“張三”就是“人”這個(gè)類的一個(gè)對象。我們可以通過如下語句來創(chuàng)建“張三”這個(gè)對象:Person zhangsan = new Person();這里用到了Person這個(gè)類的一個(gè)默認(rèn)構(gòu)造函數(shù)來創(chuàng)建zhangsan這個(gè)對象。至于setXXX,getXXX分別用來設(shè)置和獲取屬性XXX的值。
Object是所有類的父類,任何類都默認(rèn)繼承Object。Object類到底實(shí)現(xiàn)了哪些方法?
1.clone方法
保護(hù)方法,實(shí)現(xiàn)對象的淺復(fù)制,只有實(shí)現(xiàn)了Cloneable接口才可以調(diào)用該方法,否則拋出異常。
2.getClass方法
final方法,獲得運(yùn)行時(shí)類型。
3.toString方法
該方法用得比較多,一般子類都有覆蓋。
4.finalize方法
該方法用于釋放資源。因?yàn)闊o法確定該方法什么時(shí)候被調(diào)用,很少使用。
5.equals方法
該方法是非常重要的一個(gè)方法。一般equals和==是不一樣的,但是在Object中兩者是一樣的。子類一般都要重寫這個(gè)方法。
6.hashCode方法
該方法用于哈希查找,重寫了equals方法一般都要重寫hashCode方法。這個(gè)方法在一些具有哈希功能的Collection中用到。
一般必須滿足obj1.equals(obj2)==true。可以推出obj1.hash-
Code()==obj2.hashCode(),但是hashCode相等不一定就滿足equals。不過為了提高效率,應(yīng)該盡量使上面兩個(gè)條件接近等價(jià)。
7.wait方法
wait方法就是使當(dāng)前線程等待該對象的鎖,當(dāng)前線程必須是該對象的擁有者,也就是具有該對象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long
timeout)設(shè)定一個(gè)超時(shí)間隔,如果在規(guī)定時(shí)間內(nèi)沒有獲得鎖就返回。
調(diào)用該方法后當(dāng)前線程進(jìn)入睡眠狀態(tài),直到以下事件發(fā)生。
(1)其他線程調(diào)用了該對象的notify方法。
(2)其他線程調(diào)用了該對象的notifyAll方法。
(3)其他線程調(diào)用了interrupt中斷該線程。
(4)時(shí)間間隔到了。
此時(shí)該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個(gè)InterruptedException異常。
8.notify方法
該方法喚醒在該對象上等待的某個(gè)線程。
9.notifyAll方法
該方法喚醒在該對象上等待的所有線程。
Java中創(chuàng)建對象的四種方式 1.用new語句創(chuàng)建對象,這是最常見的創(chuàng)建對象的方法。
2.運(yùn)用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實(shí)例方法。 3.調(diào)用對象的clone()方法。
4.運(yùn)用反序列化手段,調(diào)用java.io.ObjectInputStream對象的 readObject()方法。下面演示了用前面3種方式創(chuàng)建對象的過程: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對象 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對象 Customer c2=new Customer("Tom",20); System.out.println("c2: "+c2); //打印name=tom,age=20//運(yùn)用克隆手段創(chuàng)建Customer對象 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)建對象的方式以外,在程序中還可以隱含地創(chuàng)建對象,包括以下幾種情況:1.對于java命令中的每個(gè)命令行參數(shù),Java虛擬機(jī)都會(huì)創(chuàng)建相應(yīng)的String對象,并把它們組織到一個(gè)String數(shù)組中,再把該數(shù)組作為參數(shù)傳給程序入口main(String args[])方法。
2.程序代碼中的String類型的直接數(shù)對應(yīng)一個(gè)String對象。3.字符串操作符“+”的運(yùn)算結(jié)果為一個(gè)新的String對象。
4.當(dāng)Java虛擬機(jī)加載一個(gè)類時(shí),會(huì)隱含地創(chuàng)建描述這個(gè)類的Class實(shí)例.。
1. new一個(gè)對象
new ClassName();
2. 基本同上
Class.forName("className").newInstance();
3. 利用asm和cglib創(chuàng)建對象,不過這個(gè)對象在某些情況下有問題,比如做為hibernate對象的時(shí)候
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ClassName);
enhancer.setCallback(NoOp.INSTANCE);
Object obj = enhancer.create();
4.克?。篶lone()
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時(shí)間:2.763秒