一文盤(pán)點(diǎn)Java創(chuàng)建實(shí)例對(duì)象的方式
Java對(duì)象是通過(guò)加載、鏈接、初始化三大步驟來(lái)完成對(duì)象的創(chuàng)建及初始化。那么接下來(lái)就說(shuō)一下Java創(chuàng)建實(shí)例對(duì)象的方式有哪幾種。其中,new對(duì)象、靜態(tài)工廠方法和反射機(jī)制三種方式是需要通過(guò)調(diào)用類(lèi)的構(gòu)造方法進(jìn)行對(duì)象的實(shí)例化,通過(guò)反序列化和clone()方法的方式是不需要調(diào)用構(gòu)造方法進(jìn)行對(duì)象的實(shí)例化。
1.通過(guò)new方式創(chuàng)建對(duì)象,例如:Shape shape = new Shape(); 該種方式是工作中最為常見(jiàn)的一種實(shí)例化方式。
2.通過(guò)靜態(tài)工廠方法創(chuàng)建實(shí)例對(duì)象,例如:Integer.valueOf(1); 其實(shí)質(zhì)也是通過(guò)new的方式調(diào)用構(gòu)造方法來(lái)創(chuàng)建實(shí)例對(duì)象。
3.通過(guò)反射機(jī)制創(chuàng)建實(shí)例對(duì)象,通過(guò)java.lang.Class或java.lang.reflect.Constructor的newInstance()方法來(lái)創(chuàng)建實(shí)例對(duì)象,newInstance()方法創(chuàng)建實(shí)例對(duì)象的類(lèi)必須含有無(wú)參構(gòu)造方法。
- 通過(guò)Class.forName(“”).newInstance()或T.class.newInstance()創(chuàng)建實(shí)例對(duì)象;
public static void test() { try { Class clazz = Class.forName("bean.User"); //或 Class clazz = User.class; User user = (User) clazz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
- 通過(guò)Constructor.newInstance()創(chuàng)建實(shí)例對(duì)象;
public static void test() { try { Constructor<User> con = User.class.getConstructor(); User user = con.newInstance(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
4.通過(guò)反序列化方式創(chuàng)建實(shí)例對(duì)象。通過(guò)I/O技術(shù)的反序列化方式創(chuàng)建實(shí)例對(duì)象的類(lèi)必須實(shí)現(xiàn)java.io.Serializable接口。ObjectOutputStream可以通過(guò)網(wǎng)絡(luò)或本地獲取已序列化對(duì)象的二進(jìn)制字節(jié)碼進(jìn)行反序列化來(lái)創(chuàng)建該實(shí)例對(duì)象。通過(guò)反序列化方式創(chuàng)建實(shí)例對(duì)象不需要調(diào)用構(gòu)造方法。
- 創(chuàng)建User類(lèi)并實(shí)現(xiàn)Serializable接口
/** * 創(chuàng)建User類(lèi)并實(shí)現(xiàn)Serializable接口 */ public class User implements Serializable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
/** * 通過(guò)ObjectOutputStream將對(duì)象序列化字節(jié)流持久化到本地硬盤(pán) */ public static void serialization() { try { User user = new User(); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("/Users/xxx/Desktop/User.txt"))); out.writeObject(user); out.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 通過(guò)ObjectInputStream從本地硬盤(pán)中獲取對(duì)象字節(jié)流反序列化并創(chuàng)建實(shí)例對(duì)象 */ public static void deserialization() { try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("/Users/xxx/Desktop/User.txt"))); User user = (User) in.readObject(); in.close(); user.setName("serializable"); System.out.println(user.getName()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
5.通過(guò)調(diào)用對(duì)象的clone()方法創(chuàng)建實(shí)例對(duì)象。通過(guò)clone()方法創(chuàng)建實(shí)例對(duì)象需要實(shí)現(xiàn)java.lang.Cloneable接口并且可以通過(guò)復(fù)寫(xiě)Object類(lèi)的clone()方法來(lái)實(shí)現(xiàn)對(duì)象的深拷貝。調(diào)用clone()方法時(shí)JVM先為新創(chuàng)建的對(duì)象分配內(nèi)存,然后將調(diào)用clone()方法的對(duì)象復(fù)制給新創(chuàng)建的對(duì)象。通過(guò)clone()方法創(chuàng)建實(shí)例對(duì)象不需要調(diào)用構(gòu)造方法。
- 創(chuàng)建User類(lèi)并實(shí)現(xiàn)Cloneable接口,并重寫(xiě)Object類(lèi)的clone()方法
/** * 創(chuàng)建User類(lèi)并實(shí)現(xiàn)Cloneable接口,并重寫(xiě)Object類(lèi)的clone()方法 */ public class User implements Cloneable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
- 通過(guò)clone()方法創(chuàng)建新的User實(shí)例對(duì)象
public static void main(String[] args) { try { User cloneUser = new User(); User copyUser = (User) cloneUser.clone(); copyUser.setName("lisi"); System.out.println(copyUser.getName()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } }
寫(xiě)在最后
到此這篇關(guān)于一文盤(pán)點(diǎn)Java創(chuàng)建實(shí)例對(duì)象的方式的文章就介紹到這了,更多相關(guān)Java創(chuàng)建實(shí)例對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring對(duì)JDBC和orm的支持實(shí)例詳解
這篇文章主要介紹了spring對(duì)JDBC和orm的支持實(shí)例詳解,需要的朋友可以參考下2017-09-09100-200之間所有素?cái)?shù)求和程序代碼(二個(gè)版本)
寫(xiě)一個(gè)求100-200之間素?cái)?shù),并求和的程序,大家參考使用吧2013-11-11基于java枚舉類(lèi)綜合應(yīng)用的說(shuō)明
一個(gè)枚舉類(lèi),可以看成包括它的一些子類(lèi)(枚舉)的一個(gè)類(lèi),而且枚舉類(lèi)的構(gòu)造方法只能是私有的2013-05-05深入學(xué)習(xí)java ThreadLocal的源碼知識(shí)
ThreadLocal是一個(gè)本地線程副本變量工具類(lèi)。主要用于將私有線程和該線程存放的副本對(duì)象做一個(gè)映射,各個(gè)線程之間的變量互不干擾,特別適用于各個(gè)線程依賴不通的變量值完成操作的場(chǎng)景。下面我們來(lái)詳細(xì)了解一下它吧2019-06-06Java使用線程池批量處理數(shù)據(jù)操作具體流程
這篇文章主要給大家介紹了關(guān)于Java使用線程池批量處理數(shù)據(jù)操作的相關(guān)資料,Java多線程編程中線程池是一個(gè)非常重要的概念,線程池可以提高線程的復(fù)用率和任務(wù)調(diào)度的效率,尤其是當(dāng)需要查詢大批量數(shù)據(jù)時(shí),需要的朋友可以參考下2023-06-06springboot對(duì)壓縮請(qǐng)求的處理方法
這篇文章主要介紹了springboot對(duì)壓縮請(qǐng)求的處理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05使用java為pdf添加書(shū)簽的方法(pdf書(shū)簽制作)
下載一些pdf格式的電子書(shū)沒(méi)有書(shū)簽,用JAVA寫(xiě)了一個(gè)小工具,將特定格式的文本解析成為書(shū)簽,然后保存到pdf格式中2014-02-02Spring?Bean自動(dòng)裝配入門(mén)到精通
自動(dòng)裝配是使用spring滿足bean依賴的一種方法,spring會(huì)在應(yīng)用上下文中為某個(gè)bean尋找其依賴的bean,Spring中bean有三種裝配機(jī)制,分別是:在xml中顯式配置、在java中顯式配置、隱式的bean發(fā)現(xiàn)機(jī)制和自動(dòng)裝配2022-08-08Java網(wǎng)絡(luò)通信中URL與HTTP編程技術(shù)詳解
要想實(shí)現(xiàn)網(wǎng)絡(luò)編程,除了可以使用Socket之外,我們還可以利用URL編程或HTTP編程技術(shù),所以今天這篇文章,就給大家介紹一下URL編程和HTTP編程技術(shù),看看這兩種技術(shù)有什么特點(diǎn),文中有詳細(xì)的代碼講解,需要的朋友可以參考下2023-11-11