深入理解Java中四種創(chuàng)建對(duì)象的方式
作者:六尺帳篷
鏈接:https://www.jianshu.com/p/7584b028cbda
調(diào)用new語句創(chuàng)建對(duì)象 調(diào)用對(duì)象的clone()方法 運(yùn)用反射手段創(chuàng)建對(duì)象 運(yùn)用反序列化手段
調(diào)用new語句創(chuàng)建對(duì)象
// 使用java語言的關(guān)鍵字 new 創(chuàng)建對(duì)象,初始化對(duì)象數(shù)據(jù)
MyObject mo = new MyObject() ;
調(diào)用對(duì)象的clone()方法
MyObject anotherObject = new MyObject();
MyObject object = anotherObject.clone();
1.被克隆的類要實(shí)現(xiàn) Cloneable 接口。
2.被克隆的類要重寫 clone()方法。
淺拷貝: 對(duì)值類型的成員變量進(jìn)行值的復(fù)制,對(duì)引用類型的成員變量只復(fù)制引用,不復(fù)制引用的對(duì)象. 搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。 深拷貝: 對(duì)值類型的成員變量進(jìn)行值的復(fù)制,對(duì)引用類型的成員變量也進(jìn)行引用對(duì)象的復(fù)制.
原型模式的優(yōu)點(diǎn)。
原型模式的使用場(chǎng)景。
運(yùn)用反射手段創(chuàng)建對(duì)象
反射的定義
反射機(jī)制是在運(yùn)行時(shí), 對(duì)于任意一個(gè)類, 都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象, 都能夠調(diào)用它的任意一個(gè)方法。在 java 中,只要給定類的名字, 那么就可以通過反射機(jī)制來獲得類的所有信息。 反射機(jī)制主要提供了以下功能:在運(yùn)行時(shí)判定任意一個(gè)對(duì)象所屬的類;在運(yùn)行時(shí)創(chuàng)建對(duì)象;在運(yùn)行時(shí)判定任意一個(gè)類所具有的成員變量和方法;在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法;生成動(dòng)態(tài)代理。
哪里用到反射機(jī)制?
反射的實(shí)現(xiàn)方式
Class.forName(“類的路徑” ); 類名.class 對(duì)象名.getClass() 如果是基本類型的包裝類, 則可以通過調(diào)用包裝類的 Type 屬性來獲得該包裝類的 Class 對(duì)象, Class clazz = Integer.TYPE;
實(shí)現(xiàn) Java 反射的類
1)Class:它表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口。 2)Field:提供有關(guān)類或接口的屬性信息, 以及對(duì)它的動(dòng)態(tài)訪問權(quán)限。 3)Constructor:提供關(guān)于類的單個(gè)構(gòu)造方法的信息以及對(duì)它的訪問權(quán)限
注意:Class類是Java反射中最重要的一個(gè)功能類,所有獲取對(duì)象的信息(包
括:方法/屬性/構(gòu)造方法/訪問權(quán)限)都需要它來實(shí)現(xiàn)。
反射機(jī)制的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
(1) 能夠運(yùn)行時(shí)動(dòng)態(tài)獲取類的實(shí)例, 大大提高程序的靈活性。 (2) 與 Java 動(dòng)態(tài)編譯相結(jié)合, 可以實(shí)現(xiàn)無比強(qiáng)大的功能。
缺點(diǎn):
運(yùn)用反序列化手段
序列化與反序列化
為什么需要序列化與反序列化
對(duì)象序列化
java.io.ObjectOutputStream代表對(duì)象輸出流,它的writeObject(Object obj)方法可對(duì)參數(shù)指定的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫到一個(gè)目標(biāo)輸出流中。只有實(shí)現(xiàn)了Serializable和Externalizable接口的類的對(duì)象才能被序列化。 java.io.ObjectInputStream代表對(duì)象輸入流,它的readObject()方法從一個(gè)源輸入流中讀取字節(jié)序列,再把它們反序列化為一個(gè)對(duì)象,并將其返回。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/*
* 序列化流:把對(duì)象按照流一樣的方式存入文本或者在網(wǎng)絡(luò)中傳輸; 對(duì)象 ---> 流 :ObjectOutputStream
* 反序列化流:把文本文件中的流對(duì)象數(shù)據(jù)或者網(wǎng)絡(luò)中的流對(duì)象數(shù)據(jù)還原成對(duì)象。 流---> 對(duì)象 :ObjectInputStream
*/
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException {
// 序列化數(shù)據(jù)其實(shí)就是把對(duì)象寫到文本文件
//write();
read();
}
private static void read() throws IOException {
// 創(chuàng)建反序列化流對(duì)象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"a.txt"));
// 讀取,還原對(duì)象
try {
Person p = (Person) ois.readObject();
System.out.println(p.toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ois.close();
}
private static void write() throws IOException {
// 創(chuàng)建序列化流對(duì)象
// public ObjectOutputStream(OutputStream out)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
"a.txt"));
// 創(chuàng)建對(duì)象
Person p = new Person("java", 20);
oos.writeObject(p);
// 釋放資源
oos.close();
}
}
import java.io.Serializable;
/*
* NotSerializableException為序列化異常,
* 該類需要實(shí)現(xiàn)一個(gè)接口:Serializable序列化接口,該接口中并沒有任何方法,僅僅作為標(biāo)識(shí)。
* 類似于此的沒有方法的接口是標(biāo)記接口
*
* !!!每一次去修改該類的時(shí)候都會(huì)生成一個(gè)新的序列化標(biāo)識(shí)的值!,需要重新新,重新讀,這是基本方法。
* 想辦法來固定該類的標(biāo)識(shí)ID,人為設(shè)定。這樣即使再次修改類的內(nèi)容,只要ID固定了就可以保證,在讀取的時(shí)候一直是匹配的。
* 增加 generated serial version ID,在類里面直接點(diǎn)擊黃色即可,增加一個(gè)變化的ID值
*/
/*
* 當(dāng)有的成員變量不需要被序列化時(shí):如何解決。
* 方法使用transient關(guān)鍵字聲明不需要序列化的成員變量
*/
public class Person implements Serializable{
/**
* serialVersionUID
*/
private static final long serialVersionUID = -9164765814868887767L;
private String name;
private transient int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。
正文結(jié)束
1.心態(tài)崩了!稅前2萬4,到手1萬4,年終獎(jiǎng)扣稅方式1月1日起施行~
2.深圳一普通中學(xué)老師工資單曝光,秒殺程序員,網(wǎng)友:敢問是哪個(gè)學(xué)校畢業(yè)的?
3.從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧
5.清華大學(xué):2021 元宇宙研究報(bào)告!
6.為什么國(guó)內(nèi) 996 干不過國(guó)外的 955呢?

評(píng)論
圖片
表情
