Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言收厨。Java 技術(shù)具有卓越的通用性晋柱、高效性、平臺移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心蜗细、游戲控制臺注竿、科學(xué)超級計(jì)算機(jī)兼吓、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。
給你學(xué)習(xí)路線:html-css-js-jq-javase-數(shù)據(jù)庫-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
作為Java開發(fā)者,我們每天創(chuàng)建很多對象进栽,但我們通常使用依賴管理系統(tǒng),比如Spring去創(chuàng)建對象恭垦。然而這里有很多創(chuàng)建對象的方法快毛,我們會在這篇文章中學(xué)到。
Java中有5種創(chuàng)建對象的方式署照,下面給出它們的例子還有它們的字節(jié)碼
小編推薦一個學(xué)Java的學(xué)習(xí)裙【 六五零祸泪,五五四,六零七 】建芙,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)懂扼!裙內(nèi)有開發(fā)工具禁荸,很多干貨和技術(shù)資料分享!
如果你運(yùn)行了末尾的的程序阀湿,你會發(fā)現(xiàn)方法1,2,3用構(gòu)造函數(shù)創(chuàng)建對象赶熟,方法4,5沒有調(diào)用構(gòu)造函數(shù)。
1.使用new關(guān)鍵字
這是最常見也是最簡單的創(chuàng)建對象的方式了陷嘴。通過這種方式映砖,我們可以調(diào)用任意的構(gòu)造函數(shù)(無參的和帶參數(shù)的)。
Employee emp1 = new Employee();
0: new #19 // class org/programming/mitra/exercises/Employee3: dup4: invokespecial #21 // Method org/programming/mitra/exercises/Employee."":()V
2.使用Class類的newInstance方法
我們也可以使用Class類的newInstance方法創(chuàng)建對象灾挨。這個newInstance方法調(diào)用無參的構(gòu)造函數(shù)創(chuàng)建對象邑退。
我們可以通過下面方式調(diào)用newInstance方法創(chuàng)建對象:
Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();
或者
Employee emp2 = Employee.class.newInstance();
51: invokevirtual #70 // Method java/lang/Class.newInstance:()Ljava/lang/Object;
3.使用Constructor類的newInstance方法
和Class類的newInstance方法很像, java.lang.reflect.Constructor類里也有一個newInstance方法可以創(chuàng)建對象劳澄。我們可以通過這個newInstance方法調(diào)用有參數(shù)的和私有的構(gòu)造函數(shù)地技。
Constructor constructor = Employee.class.getConstructor();Employee emp3 = constructor.newInstance();
111: invokevirtual #80 // Method java/lang/reflect/Constructor.newInstance:([Ljava/lang/Object;)Ljava/lang/Object;
這兩種newInstance方法就是大家所說的反射。事實(shí)上Class的newInstance方法內(nèi)部調(diào)用Constructor的newInstance方法秒拔。這也是眾多框架莫矗,如Spring、Hibernate、Struts等使用后者的原因作谚。想了解這兩個newInstance方法的區(qū)別三娩,請看這篇Creating objects through Reflection in Java with Example.
4.使用clone方法
無論何時我們調(diào)用一個對象的clone方法,jvm就會創(chuàng)建一個新的對象妹懒,將前面對象的內(nèi)容全部拷貝進(jìn)去尽棕。用clone方法創(chuàng)建對象并不會調(diào)用任何構(gòu)造函數(shù)。
要使用clone方法彬伦,我們需要先實(shí)現(xiàn)Cloneable接口并實(shí)現(xiàn)其定義的clone方法滔悉。
Employee emp4 = (Employee) emp3.clone();
162: invokevirtual #87 // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;
小編推薦一個學(xué)Java的學(xué)習(xí)裙【 六五零,五五四单绑,六零七 】回官,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)搂橙!裙內(nèi)有開發(fā)工具歉提,很多干貨和技術(shù)資料分享!
5.使用反序列化
當(dāng)我們序列化和反序列化一個對象区转,jvm會給我們創(chuàng)建一個單獨(dú)的對象苔巨。在反序列化時,jvm創(chuàng)建對象并不會調(diào)用任何構(gòu)造函數(shù)废离。
為了反序列化一個對象侄泽,我們需要讓我們的類實(shí)現(xiàn)Serializable接口
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
261: invokevirtual #118 // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;
我們從上面的字節(jié)碼片段可以看到,除了第1個方法蜻韭,其他4個方法全都轉(zhuǎn)變?yōu)閕nvokevirtual(創(chuàng)建對象的直接方法)悼尾,第一個方法轉(zhuǎn)變?yōu)閮蓚€調(diào)用,new和invokespecial(構(gòu)造函數(shù)調(diào)用)肖方。
例子
讓我們看一看為下面這個Employee類創(chuàng)建對象:
class Employee implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private String name; public Employee() {
下面的Java程序中闺魏,我們將用5種方式創(chuàng)建Employee對象。你可以從GitHub找到這些代碼俯画。
public class ObjectCreation { public static void main(String... args) throws Exception { // By using new keyword
小編推薦一個學(xué)Java的學(xué)習(xí)裙【 六五零析桥,五五四,六零七 】艰垂,無論你是大牛還是小白泡仗,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具材泄,很多干貨和技術(shù)資料分享沮焕!
程序會輸出:
Employee Constructor Called...Employee [name=Naresh], hashcode : -1968815046Employee Constructor Called...Employee [name=Rishi], hashcode : 78970652Employee Constructor Called...Employee [name=Yogesh], hashcode : -1641292792Employee [name=Atul], hashcode : 2051657Employee [name=Akash], hashcode?: 63313419