【Java基礎】2020.01.08抽象類&接口&異常

抽象類

1.抽象類和普通類的區別

1、 抽象類需要修飾符abstract,而普通類不需要;
2、 普通類可以被實例化,而抽象類不可以被實例化;
3、 抽象方法只能定義在抽象類之中,而抽象類中既可以定義普通類也可以定義普通方法;
4、 普通類不可以存在抽象方法;
5、 一個類在繼承抽象類是,如果沒有實現所有抽象方法,那麼該抽象類也必須聲明爲抽象類;
6、 抽象類不可以實例化,但可以指向一個實現它的子類對象;
7、 抽象方法沒有方法體;
8、 abstract不能和final同時修飾一個類,abstract不能和static、private、final和native並列修飾同一方法。

2.抽象類的優點

抽象類中已經對實現的方法可以被子類使用,使代碼可以複用;
同時提供了抽象方法,保證了子類具有自身的獨立性。

3.語法

[訪問符] abstract class 類名{
[訪問符] abstract<返回類型>([參數列表]);
}

4.Demo

抽象類:

package com.hyg.abs;
/**
 * 抽象類:模仿的多態
 * @author 15332
 *
 */
public abstract class Shape {
	//抽象方法:面積
	public abstract double callArea();//抽象類裏的抽象方法必須有abstract關鍵字
	//抽象方法:周長
	public abstract double callPre();
}

實現類:

package com.hyg.abs;
/**
 * 實現類
 * @author 15332
 *
 */
public class Circle extends Shape {
	public int raduis;//半徑
	
	/*
	 * 有參構造方法
	 */
	public Circle(int raduis) {
		this.raduis = raduis;
	}
	/*
	 * 無參構造方法
	 */
	public Circle() {
		
	}
	
	/*
	 * 實現父類的抽象方法
	 * @see com.hyg.abs.Shape#callArea()
	 */
	@Override
	public double callArea() {
		// TODO Auto-generated method stub
		return Math.PI*raduis*raduis;
	}

	@Override
	public double callPre() {
		// TODO Auto-generated method stub
		return Math.PI*2*raduis;
	}
}

測試類:

package com.hyg.abs;

public class TestAbs {
	public static void main(String[] args) {
		Shape shape = new Circle(5);//抽象類不能直接實例化,只能指向他的實現類
		System.out.println("圓的面積爲:"+shape.callArea());
		System.out.println("圓的周長爲:"+shape.callPre());
	}
}


接口

1.抽象與接口的相同點

1、 只被繼承;
2、 不能通過new方法直接實例化;
3、 變量可以引用具體實現類的實例;

2.抽象與接口的區別

1、 抽象類是is – a的關係,接口是has – a ;接口一般都是添加額外的功能;
2、 抽象類與接口最大的區別在於抽象類的屬性是可以繼承的。而接口只是常量;
3、 一般情況下我們儘可能使用接口,因爲接口從方法上去描述對象特性,可以實現多個接口。而繼承只能繼承一個。
4、 抽象類可以定義任意屬性,可以重新定義或賦值,而接口默認是常量,用public static fina I修飾的,必須賦初值;
5、 抽象類可以有抽象方法和已實現的方法,而接口方法均只有方法聲明,沒有方法體; 不存在已實現的方法;
6、 抽象類中extends來表示繼承抽象類,只能繼承一個父類;繼承抽象類的同時,必須實現抽象類中的所有抽象方法,而接口用implements來表示實現接口,可以實現多個接口,實現接口的同時,實現接口中的所有方法;
7、 抽象類可以有靜態代碼塊和靜態方法,接口不能有靜態代碼塊和靜態方法

3.定義接口

語法:
<訪問符>interface 接口名{
[訪問符]<返回類型>方法名([參數列表]);
}

4.實現接口

一個類實現一個接口實,必須實現接口中定義的所有沒有方法體的方法,除非將該類定義爲抽象類。
語法:
<訪問符>class 類名 implements 接口名[,接口列表]{
……
}

instanceof運算符

格式:<引用類型變量>instanceof<引用類型>
當instanceof左側的引用類型變量所引用對象的實際類型是其右側給出的類型或其子類類型時,表達式結果爲true ,否則爲false

異常

1.非檢查型類型

指編譯器不要求強制處理的異常。因設計或實現方式不當導致的,可以避免。

常見非檢查型異常

在這裏插入圖片描述

2.檢查型類型

是指編譯器要求必須處理的異常,是程序運行時由外界因素造成的一般性異常。

常見檢查型異常

檢查型類型 描述
SQLException 操作數據庫時發生的異常
IOException 操作文件時發生的異常
FileNotFoundException 訪問不存在的文件的異常
ClassNotFoundException 找不到指定名稱類的異常

3.兩種處理異常的機制

捕獲異常

在程序運行過程中系統得到一個異常對象時,它將會沿着方法的調用棧逐層回溯,尋找處理這一異常的代碼,找到處理這種類型異常的方法後,運行時系統把當前異常對象交給這個方法進行處理,該過程稱爲捕獲(catch)異常。

聲明拋出異常

當運行時系統得到一個異常對象,如果當前方法並不知道如何處理所出現的異常或者此時處理不合適,則可在定義方法時,聲明拋出(throws)異常。

4.異常處理涉及的關鍵字

try、catch、finally、throw和throws
在這裏插入圖片描述

5.try – catch

解釋

try代碼塊的功能就是監視異常的發生。
catch塊進行捕獲並處理。

語法

try {
    // 代碼段(可能發生異常的代碼)
} catch (Throwable ex) {
    // 對異常進行處理的代碼段
}

示意圖

在這裏插入圖片描述

6.多重catch處理異常

解釋

在一個程序中可能會引發多種不同類型的異常,此時可以提供多個catch語句用來捕獲用戶感興趣的異常。當引發異常時,程序會按順序來查看每個catch語句塊,並執行第一個與異常類型匹配的catch語句塊,其後的catch語句塊將被忽略。

語法

try {
// 代碼段
// 產生異常(異常類型2)
} catch (異常類型1 ex) {
// 對異常進行處理的代碼段
} catch (異常類型2 ex) {
// 對異常進行處理的代碼段
} catch (異常類型3 ex) {
// 對異常進行處理的代碼段
}

示意圖

在這裏插入圖片描述

7.finally

解釋

在某些特定的情況下,不管是否有異常發生,總是要求某些特定的代碼必須被執行,比如進行數據庫連接時,不管對數據庫的操作是否成功,最後都需要關閉數據庫的連接並釋放內存資源。這就需要用到finally關鍵字,finally不能單獨使用必須和try結合使用。

兩種用法:

try-finally
try-catch-finally (較爲常用)

語法

try {
     // 代碼段(可能發生異常代碼)
} catch (Throwable ex) {
     // 對異常進行處理的代碼段
} finally {
     // 總要被執行的代碼
}

示意圖

在這裏插入圖片描述

8.throw/throws

在Java程序中如果要明確地引發異常,則需要用到throw或throws語句

throw語句

throw語句用來明確地拋出一個“異常”。

throws語句

如果一個方法methodName()可以引發異常,而它本身並不對該異常進行處理,那麼該方法必須聲明將這個異常拋出,以使程序能夠繼續執行下去。這時候就要用到throws語句。

語法

returnType  methodName() throws ExceptionType1,ExceptionType2 {
    // body
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章