1. 程式人生 > >《Java程式設計》第7周學習總結

《Java程式設計》第7周學習總結

201711671215《Java程式設計》第7周學習總結

教材學習內容總結

第6章:介面與實現

6.1 介面

使用關鍵字interface來定義一個介面。介面的定義和類的定義相似,分為介面宣告和介面體,例如:

interface Printable {
    final int MAX=100;
    void add();
    float sum(float x,float y);
}
1、介面宣告:定義介面時使用關鍵字interface來宣告自己是一個介面,格式如下:

interface 介面的名字
2、介面體

介面體中包含常量的宣告(沒有變數)和抽象方法兩部分。

介面體中所有的常量的訪問許可權一定都是public,而且是static常量(允許省略public、final和static修飾符),所有的抽象方法的訪問許可權一定都是public(允許省略public abstract修飾符),例如:

interface Printable {
    public static final int MAX=100;   //等價寫法:int MAX=100;
    public abstract void add();        //等價寫法:void add();
    public abstract float sum(float x,float y);
}
6.2 實現介面

1、類實現介面

一個類需要在類宣告中使用關鍵字implement宣告該類實現一個或多個介面。如果實現多個介面,用逗號隔開介面名,例如:

class A implements Printable,Addable
2、重寫介面中的方法

如果一個非抽象類實現了某個介面,那麼這個類必須重寫這個介面中的所有方法。

注意:由於介面中的方法一定是public abstract方法,所以類在重寫介面方法時不僅要去掉abstract修飾符、給出方法體,而且方法的訪問許可權一定要明顯地用public來修飾(否則就降低了訪問許可權,這是不允許的)。

介面可以通過繼承產生新的介面。

3、介面的細節說明

注:Java提供的介面都在相應的包中,通過import語句不僅可以引入包中的類,也可以引入包中的介面。例如:

import java.io.*;
不僅引入了java.io包中的類,同時也引入了該包中的介面。

6.3 介面的UML圖

使用一個長方形描述一個介面的主要構成,將長方形垂直地分成三層。

頂部第一層是名字層,介面的名字必須是斜體字形,而且需要用<<interface>>修飾名字,並且該修飾和名字分列在兩行。

第二層是常量層,列出介面中的常量及型別,格式是“常量名字:型別”。

第三層是方法層,也稱操作層,列出介面中的方法及返回型別,格式是“方法名字(引數列表):型別”。

                   實現關係的UML圖
 

 

如果一個類實現了一個介面,類和介面的關係是實現關係,稱類實現介面。

UML通過使用虛線連線類和它所實現的介面,虛線的起始端是類,虛線的終點端是它實現的介面,但終點端使用一個空心的三角形表示虛線的結束。

6.4 介面回撥

介面屬於引用型變數,介面變數中可以存放實現該介面的類的例項的引用,即存放物件的引用。

介面回撥是指:可以把實現某一介面的類建立的物件的引用賦值給該介面宣告的介面變數,那麼該介面變數就可以呼叫被類實現的介面方法。實際上,當介面變數呼叫被類實現的介面方法時,就是通知相應的物件呼叫這個方法。

介面回撥非常類似於上轉型物件呼叫子類重寫的方法。

注:介面無法呼叫類中的其他的非介面方法。

6.5 理解介面

理解的關鍵點是:

(1)介面可以抽象出重要的行為標準,該行為標準用抽象方法來表示。

(2)可以把實現介面的類的物件的引用賦值給介面變數,該介面變數可以呼叫被該類實現的介面方法,即體現該類根據接口裡的行為標準給出的具體行為。

介面的思想:它可以要求某些類有相同名稱的方法,但方法的具體內容(方法體的內容)可以不同,即要求這些類實現介面,以保證這些類一定有介面中所宣告的方法(即所謂的方法繫結)。介面在要求一些類有相同名稱的方法的同時,並不強迫這些類具有相同的父類。

6.6 介面與多型

由介面產生的多型就是指不同的類在實現同一個介面時可能具有不同的實現方式,那麼介面變數在回撥介面方法時就可能具有多種形態。

6.7 介面引數

如果一個方法的引數是介面型別,我們就可以將任何實現該介面的類的例項的引用傳遞給該介面引數,那麼介面引數就可以回撥類實現的介面方法。

6.8 abstract類與介面的比較

1、abstract類和介面都可以有abstract方法。

2、介面中只可以有常量,不能有變數;而abstract類中既可以有常量,也可以有變數。

3、abstract類中也可以有非abstract方法,介面不可以。

(抽象類與介面:1、作為行為準則。2、抽象類用在同一類別物件。3、介面更注重行為一致性。)

6.9 面向介面程式設計

介面只關心操作,但不關心這些操作的具體實現細節,可以使我們把主要精力放在程式的設計上,而不必拘泥於細節的實現。也就是說,可以通過在介面中宣告若干個abstract方法,表明這些方法的重要性,方法體的內容細節由實現介面的類去完成。

核心思想:使用介面回撥。

第7章:內部類與異常類

7.1 內部類

Java支援在一個類中定義另一個類,這樣的類稱作內部類,而包含內部類的類稱為內部類的外嵌類。

內部類和外嵌類之間的重要關係:

1、內部類的外嵌類的成員變數在內部類中仍然有效,內部類中的方法也可以呼叫外嵌類中的方法。

2、內部類的類體中不可以宣告類變數和類方法。外嵌類的類體中可以用內部類宣告物件,作為外嵌類的成員。

3、內部類僅供它的外嵌類使用,其他類不可以用某個類的內部類宣告物件。

注:內部類可以被修飾為static內部類。static內部類不能操作外嵌類中的例項成員變數。非內部類不可以是static類。

7.2 匿名類

7.2.1 和子類有關的匿名類

Java允許我們直接使用一個類的子類的類體建立一個子類物件,也就是說,建立子類物件時,除了使用父類的構造方法外還有類體,此類體被認為是一個子類去掉類聲明後的類體,稱作匿名類。

假設Bank是類,那麼下列程式碼就是用Bank的一個子類(匿名類)建立物件:

new Bank() {
    匿名類的類體
};
匿名類有如下特點:

1、匿名類可以繼承父類的方法也可以重寫父類的方法。

2、匿名類一定是內部類。

3、匿名類可以訪問外嵌類中的成員變數和方法,匿名類的類體中不可以宣告static成員變數和static方法。

4、由於匿名類是一個子類,但沒有類名,所以在用匿名類建立物件時,要直接使用父類的構造方法。

7.2.2 和介面有關的匿名類

假設Computable是一個介面,那麼,Java允許直接用介面名和一個類體建立一個匿名物件,此類體被認為是實現了Computable介面的類去掉類聲明後的類體,稱作匿名類。

下列程式碼就是用實現了Computable介面的類(匿名類)建立物件:

new Computable() {
    實現介面的匿名類的類體
};
7.3 異常類

所謂異常就是程式執行時可能出現的一些錯誤,異常處理將會改變程式的控制流程,讓程式有機會對錯誤做出處理。

Java使用throw關鍵字丟擲一個Exception子類的例項表示異常發生。

異常物件可以呼叫如下方法得到或輸出有關異常的資訊:

public String getMessage();
public void printStackTrace();
public String toString();
程式執行出現異常時,Java執行環境就用異常類Exception的相應子類建立一個異常物件,並等待處理。

7.3.1 try-catch語句

Java使用try-catch語句來處理異常,將可能出現的異常操作放在try-catch語句的try部分,將發生異常後的處理放在catch部分。

try-catch語句的格式如下:

try {
    包含可能發生異常的語句
}
catch(ExceptionSubClass1 e) {
    …
}
catch(ExceptionSubClass2 e) {
    …
}
各個catch引數中的異常類都是Exception的某個子類,表明try部分可能發生的異常,這些子類之間不能有父子關係,否則保留一個含有父類引數的catch即可。

注:Java的io異常(輸入輸出異常)也就是檔案不存在。

7.3.2 自定義異常類

一個方法在宣告時可以使用throw關鍵字宣告要產生的若干個異常,並在該方法的方法體中具體給出產生異常的操作,即用相應的異常類建立物件,並使用throw關鍵字丟擲該異常物件,導致該方法結束執行。

注:throw是Java的關鍵字,該關鍵字的作用就是丟擲異常。throw和throws是兩個不同的關鍵字。

7.4 斷言

斷言語句一般用於程式不準備通過捕獲異常來處理的錯誤。

1、斷言語句的語法格式

使用關鍵字assert宣告一條斷言語句,斷言語句有以下兩種格式:

assert booleanExpression;
assert booleanExpression:messageException;
例如,對於斷言語句:

assert number >= 0;
如果表示式number>=0的值為true,程式繼續執行,否則程式立刻結束執行。

如果使用

assert booleanExpression;
形式的斷言語句,當booleanExpression的值是true時,程式從斷言語句處繼續執行;值是false時,程式從斷言語句處停止執行。

如果使用

assert booleanExpression:messageException;
形式的斷言語句,當booleanExpression的值是true時,程式從斷言語句處繼續執行;值是false時,程式從斷言語句處停止執行,並輸出messageException表示式的值,提示使用者出現了怎麼樣的問題。

2、啟用與關閉斷言語句

當使用Java直譯器直接執行應用程式時,預設地關閉斷言語句,在除錯程式時可以使用-ea啟用斷言語句,例如:

java -ea mainClass
7.5 應用舉例

帶finally子語句的try-catch語句,語法格式如下:

try{ }
catch(ExceptionSubClass e){  }
finally{ }
其執行機制是:在執行try-catch語句後,執行finally子語句,也就是說,無論在try部分是否發生過異常,finally子語句都會被執行。

教材學習中的問題和解決過程

無。

程式碼除錯中的問題和解決過程

無。

感悟

這周的知識開始有點難理解了,還是要多實踐與思考。