定義:一種識別及響應(yīng)錯誤的一致性搞疗,在使用異常的時候嗓蘑,出現(xiàn)異常我們能知道“什么異常”被拋出匿乃?異常在哪拋出桩皿?為什么會拋出這個異常?
異常的幾個關(guān)鍵字:
try:用于監(jiān)聽try語句里面的代碼幢炸,當發(fā)生異常時會調(diào)用catch去捕獲泄隔,發(fā)生異常代碼后的代碼將不會繼續(xù)執(zhí)行
catch:用于捕獲異常,即try里面的異常
finally:當try和catch里面的代碼執(zhí)行完還沒有返回時執(zhí)行這個方法宛徊,通常我們在這個方法中做數(shù)據(jù)庫的關(guān)閉梅尤、網(wǎng)絡(luò)連接關(guān)閉柜思、流關(guān)閉或回收一些資源等
throw:用于拋出異常
throws:用于聲明該方法可能拋出異常
finally與return 執(zhí)行順序
finally的執(zhí)行順序是在try和catch執(zhí)行完之后、return返回之前巷燥,如果finally里面已經(jīng)執(zhí)行了return或throw,則不會再去執(zhí)行try或catch中的return 或throw
Java異成呐蹋框架
1.Throwable:是java語言中所有錯誤或異常的父類,他有兩個子類缰揪,分別為Error和Exception,Throwable包含了其線程創(chuàng)建時線程執(zhí)行堆棧的快照陨享,提供了printStackTrace來獲取堆棧跟蹤數(shù)據(jù)等信息
2.Exception:它指出了合理的應(yīng)用程序想要捕獲的條件
3.RuntimeException:這個是運行期間可能拋出的異常的父類,編譯器不會檢查這一類的異常钝腺,可通過修改代碼進行修復(fù)
4.Error:直接使虛擬機崩潰的錯誤抛姑,編譯器不會進行檢查
抽象類和接口的區(qū)別
- 抽象類和接口都不能直接實例化,如果要實例化艳狐,抽象類變量必須指向?qū)崿F(xiàn)所 有抽象方法的子類對象定硝,接口變量必須指向?qū)崿F(xiàn)所有接口方法的類對象。
- 抽象類要被子類繼承毫目,接口要被類實現(xiàn)蔬啡。
- 接口里定義的變量只能是公共的靜態(tài)的常量,抽象類中的變量是普通變量镀虐。
- 抽象類里可以沒有抽象方法箱蟆。
- 接口可以被類多實現(xiàn)(被其他接口多繼承),抽象類只能被單繼承刮便。
- 接口中沒有 this 指針空猜,沒有構(gòu)造函數(shù),不能擁有實例字段(實例變量)或
實例方法恨旱。 - 抽象類不能在Java 8 的 lambda 表達式中使用辈毯。
深拷貝和淺拷貝
對象拷貝:就是一個對象的屬性拷貝到另一個有著相同類型的對象中去
1.淺拷貝:值傳值、對象傳引用(地址)
代碼實現(xiàn):就是實現(xiàn)CloneAble接口并重寫其clone方法搜贤,其中clone方法調(diào)用中使用 super.clone();
對sourceobject的refObj做改變會影響到CopiedObject中的refObj,因為他們兩個對象都是使用同一個refObj,對field1改變不影響field2
public class Student implements Cloneable { // 對象引用
private Subject subj;
private String name;
public Student(String s, String sub) {
name = s;
subj = new Subject(sub);
}
public Subject getSubj() {
return subj;
}
public String getName() {
return name;
}
public void setName(String s) {
name = s;
}
/**
* 重寫clone()方法 * @return
*/
public Object clone() { //淺拷貝
try {
// 直接調(diào)用父類的clone()方法 return super.clone();
} catch (CloneNotSupportedException e) {
return null;
} }
}
2.深拷貝
代碼實現(xiàn):就是實現(xiàn)CloneAble接口谆沃,并重寫clone方法,在clone方法中創(chuàng)建一個新的對象并將這個對象的屬性賦值給他
public class Student implements Cloneable { // 對象引用
private Subject subj;
private String name;
public Student(String s, String sub) {
name = s;
subj = new Subject(sub);
}
public Subject getSubj() {
return subj;
}
public String getName() {
return name;
}
public void setName(String s) {
name = s;
}
/**
* 重寫clone()方法 *
* @return
*/
public Object clone() {
// 深拷貝入客,創(chuàng)建拷貝類的一個新對象管毙,這樣就和原始對象相互獨立
Student s = new Student(name, subj.getName());
return s;
}
}
序列化
就是將對象轉(zhuǎn)換為流的形式,將內(nèi)存中的對象變成一連串的字節(jié)桌硫,可以用于網(wǎng)絡(luò)傳輸對象
通過序列化來實現(xiàn)深拷貝
public class ColoredCircle implements Serializable {
private int x;
private int y;
public ColoredCircle(int x, int y) { this.x = x;
this.y = y; }
public int getX() {
return x;
}
public void setX(int x) { this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) { this.y = y;
}
@Override
public String toString() {
return "x=" + x + ", y=" + y;
}
}
------------------------------------------------
public class DeepCopy {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
// 創(chuàng)建原始的可序列化對象
ColoredCircle c1 = new ColoredCircle(100, 100); System.out.println("Original = " + c1);
ColoredCircle c2 = null; // 通過序列化實現(xiàn)深拷貝
ByteArrayOutputStream bos = new ByteArrayOutputStream()
oos = new ObjectOutputStream(bos); // 序列化以及傳遞這個對象
oos.writeObject(c1);
oos.flush();
ByteArrayInputStream bin = new eam(bos.toByteArray());
ByteArrayInputStr
ois = new ObjectInputStream(bin);
// 返回新的對象
c2 = (ColoredCircle) ois.readObject();
// 校驗內(nèi)容是否相同 System.out.println("Copied
// 改變原始對象的內(nèi)容
c1.setX(200);
c1.setY(200);
// 查看每一個現(xiàn)在的內(nèi)容 System.out.println("Original = " + c1); System.out.println("Copied = " + c2);
} catch (Exception e) {
System.out.println("Exception in main = " + e);
} finally {
oos.close();
ois.close();
}
}
}
這種方式實現(xiàn)深拷貝不建議用夭咬,他的效率比較慢
Transient
1)一旦變量被transient修飾,變量將不再是對象持久化的一部分铆隘,該變量內(nèi)容在序列化后無法獲得訪問卓舵。
2)transient關(guān)鍵字只能修飾變量,而不能修飾方法和類膀钠。注意掏湾,本地變量是不能被 transient關(guān)鍵字修飾的裹虫。變量如果是用戶自定義類變量,則該類需要實現(xiàn) Serializable接口融击。
3)被transient關(guān)鍵字修飾的變量不再能被序列化筑公,一個靜態(tài)變量不管是否被 transient修飾,均不能被序列化尊浪。