Java中創(chuàng)建對象的6種方式
背景
本文教你創(chuàng)建對象的 6 種方式,從低端到高端,各種創(chuàng)建方式,總有一個適合你,沒有對象的自己生成一個吧!
創(chuàng)建對象的 6 種方式
假設有個女朋友類:
@Data @NoArgsConstructor @AllArgsConstructor class GirlFriend { private String name; }
注解使用的是 Lombok 框架注解,方便快速開發(fā)
方法1:new 一個對象
沒對象就 new 一個吧,沒錯,使用 new 關鍵字,這也是 Java 創(chuàng)建對象最簡單直接的方式了。
示例代碼:
@Test public void girlFriend1() { GirlFriend girlFriend = new GirlFriend("new一個對象"); System.out.println(girlFriend); }
輸出結(jié)果:
GirlFriend(name=new一個對象)
方法2:克隆一個對象
朋友有女朋友,你沒有,如果可以,把別人的女朋友克隆一個吧?
讓女朋友類先實現(xiàn) Cloneable 接口,并且實現(xiàn)其 clone() 方法:
@Data @NoArgsConstructor @AllArgsConstructor class GirlFriend implements Cloneable { private String name; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
注意:這里演示默認使用的是淺拷貝,即只克隆基本類型的字段,引用類型的需要再重寫 clone() 方法手動賦下引用字段的值。
現(xiàn)在克隆一個對象,示例代碼:
@Test public void girlFriend2() throws CloneNotSupportedException { GirlFriend girlFriend1 = new GirlFriend("克隆一個對象"); GirlFriend girlFriend2 = (GirlFriend) girlFriend1.clone(); System.out.println(girlFriend2); }
輸出結(jié)果:
GirlFriend(name=克隆一個對象)
使用克隆的好處就是可以快速創(chuàng)建一個和原對象值一樣的對象,對象的字段值一樣,但是兩個不同的引用。
方法3:類派發(fā)一個對象(反射)
直接使用女朋友類派發(fā)一個吧:
@Test public void girlFriend3() throws InstantiationException, IllegalAccessException { GirlFriend girlFriend = GirlFriend.class.newInstance(); girlFriend.setName("類派發(fā)一個對象"); System.out.println(girlFriend); }
輸出結(jié)果:
GirlFriend(name=類派發(fā)一個對象)
方法4:動態(tài)加載一個對象(反射)
知道女朋友類在哪里(類全路徑),但卻沒有被加載,那就反射一個對象吧:
@Test public void girlFriend4() throws InstantiationException, IllegalAccessException, ClassNotFoundException { GirlFriend girlFriend = (GirlFriend) Class.forName("cn.javastack.test.jdk.core.GirlFriend").newInstance(); girlFriend.setName("反射一個對象"); System.out.println(girlFriend); }
輸出結(jié)果:
GirlFriend(name=反射一個對象)
方法5:構造一個對象(反射)
知道女朋友類的構造,就可以調(diào)用構造器構造一個對象:
@Test public void girlFriend5() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { GirlFriend girlFriend = GirlFriend.class.getConstructor().newInstance(); girlFriend.setName("構造一個對象"); System.out.println(girlFriend); }
輸出結(jié)果:
GirlFriend(name=構造一個對象)
這里也可以同時結(jié)合類全路徑構造一個對象。
方法6:反序列化一個對象
這個和克隆的作用類似,假如以前序列化(保存)了一個女朋友在磁盤上,現(xiàn)在就可以反序列化出來。
首先讓女朋友可序列化,實現(xiàn) Serializable 接口:
@Data @NoArgsConstructor @AllArgsConstructor class GirlFriend implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private String name; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
序列化/反序列化對象示例代碼:
@Test public void girlFriend6() throws IOException, ClassNotFoundException { GirlFriend girlFriend1 = new GirlFriend("反序列化一個對象"); // 序列化一個女朋友 ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("gf.obj")); objectOutputStream.writeObject(girlFriend1); objectOutputStream.close(); // 反序列化出來 ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("gf.obj")); GirlFriend girlFriend2 = (GirlFriend) objectInputStream.readObject(); objectInputStream.close(); System.out.println(girlFriend2); }
輸出結(jié)果:
GirlFriend(name=反序列化一個對象)
總結(jié)
到此這篇關于Java中創(chuàng)建對象的6種方式的文章就介紹到這了,更多相關Java創(chuàng)建對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
為什么wait和notify必須放在synchronized中使用
這篇文章主要介紹了為什么wait和notify必須放在synchronized中使用,文章圍繞主題的相關問題展開詳細介紹,具有一定的參考價值,需要的小伙伴可以參考以參考一下2022-05-05Java并發(fā)編程之ReentrantLock可重入鎖的實例代碼
這篇文章主要介紹了Java并發(fā)編程之ReentrantLock可重入鎖的實例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板)
這篇文章主要介紹了Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12Spring中ClassPathXmlApplicationContext類的使用詳解
這篇文章主要介紹了Spring中ClassPathXmlApplicationContext類的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01ArrayList和LinkedList區(qū)別及使用場景代碼解析
這篇文章主要介紹了ArrayList和LinkedList區(qū)別及使用場景代碼解析,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01Java Fluent Mybatis 項目工程化與常規(guī)操作詳解流程篇 下
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國內(nèi)又以Mybatis用的多,基于mybatis上的增強框架,又有mybatis plus和TK mybatis等。今天我們介紹一個新的mybatis增強框架 fluent mybatis關于項目工程化與常規(guī)操作流程2021-10-10