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

