目錄
一.Java注解
什么是注解?
內置注解
元注解
二.對象克隆
什么是對象克隆?
為什么用到對象克隆
三.淺克隆深克隆
一.Java注解
什么是注解?
java中注解(Annotation)又稱java標注,是一種特殊的注釋。
????????可以添加在包,類,成員變量,方法,參數等內容上面,Java標注可以通過反射獲取標注內容。
????????注解會隨同代碼被編譯到字節碼文件中,在運行時,可以通過反射機制獲取到類中注解,然后根據不同的注解進行相應的解析。
內置注解
是java中已經定義好的注解。
@Override | 檢查該方法是否是重寫方法。如果發現其父類,或者是引用的接口中并沒有該方法時,會報編譯錯誤。 |
@Deprecated | 標記過時方法。如果使用該方法,會報編譯警告。 |
@SuppressWarnings | 指示編譯器去忽略注解中聲明的警告。 |
@FunctionalInterface | 用于指示被修飾的接口是函數式接口。 |
元注解
注解的注解,用來定義其他注解的注解。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Target(ElementType.METHOD) ? | 標注此注解可以作用在方法上面。 |
@Target({ElementType.TYPE, ElementType.METHOD}) | 標注此注解可以作用在類和方法上面。 |
@Retention(RetentionPolicy.SOURCE) ? | 在編譯階段有用的,可以不編譯到字節碼中。 |
@Retention(RetentionPolicy.RUNTIME) | 在運行時有用的,編譯到字節碼文件中去。 |
?
?
二.對象克隆
什么是對象克隆?
????????在已有的對象基礎,克隆出一個新的對象,并將已有對象中的屬性值復制到新克隆出來的對象中。
為什么用到對象克隆?
????????經常在項目開發中,各層數據傳輸時,需要將一層中的數據,封裝到另一個對象中去。
java中如何實現一個基本的對象克隆?
public class Person implements Cloneable{int num;String name;@Overrideprotected Person clone() throws CloneNotSupportedException {Person person = (Person)super.clone();return person;}
} //測試Person p1 = new Person(100,"jim");Person p2 = p1.clone(); //克隆一個新的對象System.out.println(p1==p2);//false 說明是兩個不同的對象
?
?
三.淺克隆深克隆
對于基本類型,在對象克隆時,可以將值直接復制到新對象中。
int a = 10;int b = a;b=20;
淺克隆主要是在于對象中關聯的另一個對象是否能被克隆出一個新的對象。
如果克隆時,只是將關聯對象的地址進行復制,那么就屬于淺克隆。
如果克隆時,將關聯的對象也一同克隆出了一個新的對象,那么就屬于深克隆。
淺克隆:
深克隆:?
?
?????????簡單來說,淺克隆復制的是基本類型的值,復制引用類型的地址;深克隆則會創建全新的對象,實現對象及其引用類型屬性的完全復制。
如何實現深克隆
方式1: 在克隆對象時,將對象中關聯的對象也一同進行克隆,雖然能實現,但是要逐級進行克隆,層級較多時,比較麻煩。必須實現Cloneable接口。
@Overrideprotected Person clone() throws CloneNotSupportedException {Person person = (Person) super.clone();//深度復制 聯同person中關聯的對象也一同克隆.person.address = (Address) person.address.clone();return person;}
方式2: 使用對象序列化,反序列化?,需要我們自己定義一個克隆方法,先將對象進行序列化,然后再進行反序列化,自動將多級關聯的對象也一并重新創建,使用起來比較方便,注意需要序列化的類,必須要實現Serializable接口。
public Person myclone() {Person person = null;try { // 將該對象序列化成流,因為寫在流里的是對象的一個拷貝,而原對象仍然存在于JVM里面。所以利用這個特性可以實現對象的深拷貝//序列化,將java中的對象輸出(寫)到文件中ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);// 將流序列化成對象//反序列化,將文件的信息輸入(讀)到程序中,創建一個新的對象ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);person = (Person) ois.readObject();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return person;}
對象序列化
將java中的對象輸出到一個文件中,ObjectOutputStream
反序列化
將文件中的信息輸入到程序,創建一個新的對象,ObjectInputStream
創建對象的幾種方式:
1.new 對象
2.反序列化
3.反射機制
4.對象克隆
?感謝你的閱讀與關注,如有問題歡迎探討!💓