一文盤點(diǎn)Java創(chuàng)建實(shí)例對象的方式
Java對象是通過加載、鏈接、初始化三大步驟來完成對象的創(chuàng)建及初始化。那么接下來就說一下Java創(chuàng)建實(shí)例對象的方式有哪幾種。其中,new對象、靜態(tài)工廠方法和反射機(jī)制三種方式是需要通過調(diào)用類的構(gòu)造方法進(jìn)行對象的實(shí)例化,通過反序列化和clone()方法的方式是不需要調(diào)用構(gòu)造方法進(jìn)行對象的實(shí)例化。
1.通過new方式創(chuàng)建對象,例如:Shape shape = new Shape(); 該種方式是工作中最為常見的一種實(shí)例化方式。
2.通過靜態(tài)工廠方法創(chuàng)建實(shí)例對象,例如:Integer.valueOf(1); 其實(shí)質(zhì)也是通過new的方式調(diào)用構(gòu)造方法來創(chuàng)建實(shí)例對象。
3.通過反射機(jī)制創(chuàng)建實(shí)例對象,通過java.lang.Class或java.lang.reflect.Constructor的newInstance()方法來創(chuàng)建實(shí)例對象,newInstance()方法創(chuàng)建實(shí)例對象的類必須含有無參構(gòu)造方法。
- 通過Class.forName(“”).newInstance()或T.class.newInstance()創(chuàng)建實(shí)例對象;
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(); } }
- 通過Constructor.newInstance()創(chuàng)建實(shí)例對象;
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.通過反序列化方式創(chuàng)建實(shí)例對象。通過I/O技術(shù)的反序列化方式創(chuàng)建實(shí)例對象的類必須實(shí)現(xiàn)java.io.Serializable接口。ObjectOutputStream可以通過網(wǎng)絡(luò)或本地獲取已序列化對象的二進(jìn)制字節(jié)碼進(jìn)行反序列化來創(chuàng)建該實(shí)例對象。通過反序列化方式創(chuàng)建實(shí)例對象不需要調(diào)用構(gòu)造方法。
- 創(chuàng)建User類并實(shí)現(xiàn)Serializable接口
/** * 創(chuàng)建User類并實(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; } }
/** * 通過ObjectOutputStream將對象序列化字節(jié)流持久化到本地硬盤 */ 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(); } } /** * 通過ObjectInputStream從本地硬盤中獲取對象字節(jié)流反序列化并創(chuàng)建實(shí)例對象 */ 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.通過調(diào)用對象的clone()方法創(chuàng)建實(shí)例對象。通過clone()方法創(chuàng)建實(shí)例對象需要實(shí)現(xiàn)java.lang.Cloneable接口并且可以通過復(fù)寫Object類的clone()方法來實(shí)現(xiàn)對象的深拷貝。調(diào)用clone()方法時(shí)JVM先為新創(chuàng)建的對象分配內(nèi)存,然后將調(diào)用clone()方法的對象復(fù)制給新創(chuàng)建的對象。通過clone()方法創(chuàng)建實(shí)例對象不需要調(diào)用構(gòu)造方法。
- 創(chuàng)建User類并實(shí)現(xiàn)Cloneable接口,并重寫Object類的clone()方法
/** * 創(chuàng)建User類并實(shí)現(xiàn)Cloneable接口,并重寫Object類的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(); } }
- 通過clone()方法創(chuàng)建新的User實(shí)例對象
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(); } }
寫在最后
到此這篇關(guān)于一文盤點(diǎn)Java創(chuàng)建實(shí)例對象的方式的文章就介紹到這了,更多相關(guān)Java創(chuàng)建實(shí)例對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
100-200之間所有素?cái)?shù)求和程序代碼(二個(gè)版本)
寫一個(gè)求100-200之間素?cái)?shù),并求和的程序,大家參考使用吧2013-11-11深入學(xué)習(xí)java ThreadLocal的源碼知識
ThreadLocal是一個(gè)本地線程副本變量工具類。主要用于將私有線程和該線程存放的副本對象做一個(gè)映射,各個(gè)線程之間的變量互不干擾,特別適用于各個(gè)線程依賴不通的變量值完成操作的場景。下面我們來詳細(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-06Java網(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