201711671105 《Java程式設計》第六、七章學習總結
教材學習內容總結
1.介面
eg:
interface Printable { //interface是關鍵字
public static final int MAX = 100; //public static final可省略,因為所有常量的訪問許可權一定是public,而且是static常量。
public abstract void add ();//public abstract可省略,因為所有的抽象方法都是public(不然怎麼重寫)。
public abstract float sum (float x,float y);//抽象方法
}
2.介面的實現
eg:
class A implements Printable,Addable
//類A實現Printable,Addable介面,implements為關鍵字,介面與介面間用“,”間隔。
如果一個非抽象類實現了某個介面,那麼這個類必須重寫這個介面中的所有方法。
介面中的方法一定是public abstract 方法,所以重寫時不僅要去掉abstract 修飾符,給出方法體,而且方法的訪問許可權一定要用public 修飾。
如果一個類宣告實現一個介面,但沒有重寫介面中的所有方法,那麼這個類必須是抽象類(抽象類既可以重寫介面中的方法,也可以直接擁有介面中的方法)。
2.1細節
類實現了介面後,可以在類體中使用該介面的常量。
interface前加了public的介面可以被任何類實現。如果沒有就屬於友好介面,可以被包內的類實現。
父類已實現了的介面,子類無需顯式用implements宣告。
介面也可以被繼承。用關鍵字extends宣告。子介面將繼承父介面的全部方法和常量。
3.介面回撥
介面和類一樣,也是一種資料型別。用介面宣告的變數稱作介面變數。
3.1介面回撥
把實現某一介面的類建立的物件的引用賦值給該介面宣告的介面變數,那麼該介面變數就可以呼叫被類實現的介面方法。實際上,當介面變數呼叫被類實現的介面方法時,就是通知相應的物件呼叫這個方法。
注:介面無法呼叫類中的其他的非介面的方法。
eg:
interface ShowMessage {
void 顯示商標(String s);
}
class TV implements ShowMessage {
public void 顯示商標(String s) {
System.out.println(s);
}
}
class PC implements ShowMessage {
public void 顯示商標(String s) {
System.out.println(s);
}
}
public class Example6_2 {
public static void main(String args[]) {
ShowMessage sm; //宣告介面變數
sm=new TV(); //介面變數中存放物件的引用
sm.顯示商標("長城牌電視機"); //介面回撥。
sm=new PC(); //介面變數中存放物件的引用
sm.顯示商標("聯想奔月5008PC機"); //介面回撥
}
}
4、abstract類與介面的比較
abstract類與介面 都可以有abstract方法;
介面中只可以有常量,不能有變數,而abstract類中既可以有常量也可以有變數;
abstract類中也可以有非abstract類方法,介面不可以。
設計程式時應該根據具體分析來確定使用抽象類還是介面。
abstract類除了提供重要的需要子類重寫的abstract方法外,也提供了子類可以繼承的變數和非abstract方法。如果某個問題需要使用繼承才能更好的解決問題(比如子類除了需要重寫父類的abstract方法,還需要從父類繼承一些變數或者重要的非abstract方法),就可以考慮使用abstract類。若某個問題不需要繼承,只是需要若干個類給出某些abstract方法的實現細節,就可以考慮介面。(需要繼承用abstract類,不需要繼承用介面)
5、介面引數
如果一個方法的引數是介面型別,我們就可以將任何實現該介面的類的例項的引用傳遞給該介面引數,那麼該介面引數就可以回撥類實現的介面方法。
interface SpeakHello {
void speakHello();
}
class Chinese implements SpeakHello {
public void speakHello() {
System.out.println("中國人習慣問候語:你好,吃飯了嗎? ");
}
}
class English implements SpeakHello {
public void speakHello() {
System.out.println("英國人習慣問候語:你好,天氣不錯 ");
}
}
class KindHello {
public void lookHello(SpeakHello hello) { //介面型別引數
hello.speakHello(); //介面回撥
}
}
public class Example6_5 {
public static void main(String args[]) {
KindHello kindHello=new KindHello();
kindHello.lookHello(new Chinese());
kindHello.lookHello(new English());
}
}
6、面向介面程式設計
6.1理解:
和麵向物件程式設計相似,面向介面程式設計主要編寫介面表達功能,用實現類實現功能,可以通過在介面中宣告若干個abstract方法,表面這些方法的重要性,方法體的內容細節有實現介面的類去完成。使用介面進行程式設計的核心思想是使用介面回撥,即介面變數存放實現該介面的類的物件的引用,從而介面變數就可以回撥類實現的介面方法。
6.2優點:
1 降低程式的耦合性;
2 易於程式的擴充套件;
3 有利於程式的維護;
6.3例項
public interface Advertisement { //介面
public void showAdvertisement();
public String getCorpName();
}
public class AdvertisementBoard { //負責建立廣告牌
public void show(Advertisement adver) {
System.out.println(adver.getCorpName()+"的廣告詞如下:");
adver.showAdvertisement(); //介面回撥
}
}
public class BlackLandCorp implements Advertisement {
public void showAdvertisement(){
System.out.println("**************");
System.out.printf("勞動是爹\n土地是媽\n");
System.out.println("**************");
}
public String getCorpName() {
return "黑土集團" ;
}
}
public class WhiteCloudCorp implements Advertisement { //PhilipsCorp實現Avertisement介面
public void showAdvertisement(){
System.out.println("@@@@@@@@@@@@@@@@@@@@@@");
System.out.printf("飛機中的戰鬥機,哎yes!\n");
System.out.println("@@@@@@@@@@@@@@@@@@@@@@");
}
public String getCorpName() {
return "白雲有限公司" ;
}
}
public class Example6_6 {
public static void main(String args[]) {
AdvertisementBoard board = new AdvertisementBoard();
board.show(new BlackLandCorp());
board.show(new WhiteCloudCorp());
}
}
7.內部類
定義:在一個類中定義的另一個類被稱作內部類,包含內部類的類叫做外嵌類。
關係:內部類的外嵌類的成員變數在內部類中仍然有效,內部類的方法也可以呼叫外嵌類的方法;
內部類的類體不可以宣告類變數和類方法。外嵌類的類體中可以用內部類宣告物件,作為外嵌類的成員;
內部類僅供他的外嵌類使用,其他類不可以用某個類中的內部類宣告物件。
8.匿名類
沒有顯示一個類的子類,直接使用一個類的子類的類體建立一個子類物件,此類體被認為是一個子類去掉類聲明後的類體,稱為匿名類。匿名類就是一個子類,由於無名可用,所以不能用匿名類宣告物件,但可以直接使用匿名類建立一個物件。
與子類有關的匿名類:
new Bank () {
匿名類的類體
};
與介面有關的匿名類:
new Computable () {
實現介面的匿名類的類體
};
9.異常類:
try-catch語句:
try {
包含可能發生異常的語句
}
catch (ExceptionSubClass1 e){
...
}
catch (ExceptionSubClass2 e){
...
}
//各個catch引數中的異常類都是Exception 的某個子類,如java.io.IOException,NumberFormatException,...
//也可以擴充套件Execption類定義自己的異常類
斷言語句:
斷言語句一般用於程式不準備通過捕獲異常來處理的錯誤
格式:
assert booleanExpression;
assert booleanExpression:messageException;
eg :
assert number >= 0;//如果表示式的值為true,程式繼續執行,否則立即結束執行;
assert booleanExpression:messageException;//當booleanExpression的值為true時,程式從斷言語句處繼續執行;值為false時,程式從斷言處停止執行,並輸出messageException表示式的值;
啟用斷言:
java -ea mainClass
小結:
(1)介面的介面體中只能有常量和abstract方法;
(2)和類一樣,介面也是Java中一種重要的引用型資料型別,介面變數就可以呼叫類實現的介面方法,這一過程被稱為介面回撥;
(3)當介面變數中存放了實現介面的類的物件的引用後,介面變數就可以呼叫類實現的介面方法,這一過程被稱為介面回撥;
(4)和子類體現多型類似,由介面產生的多型就是指不同的類在實現同一個介面時可能具有不同的實現方式;
(5)在使用多型設計程式時,要熟練使用介面回撥技術以及面向介面程式設計的思想,以便體現程式設計所提倡的“開-閉原則”;
(6)Java支援在一個類中宣告另一個類,這樣的類稱作內部類,包含內部類的類稱作內部類的外嵌類;
(7)和某類有關的匿名類就是該類的一個子類,該子類沒有明顯地用類宣告來定義,所以稱匿名類;和某介面有關的匿名類就是實現該介面的一個類,該子類沒有明顯地用雷勝明來定義,所以稱匿名類。
教材學習中的問題與解決過程
無
程式碼除錯中的問題與解決過程
無
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第七週 | 100/1017 | 1/6 | 8/56 | 介面的使用 |
第六週 | 325/917 | 1/5 | 10/48 | 抽象與繼承 |
第五週 | 443/592 |
1/4 | 16/38 | 類的用法 |
第四周 | 96/149 | 1/3 | 8/22 | 基本語句的複習 |
第二週 | 35/53 | 1/2 | 6/14 | 資料型別應用 |
第一週 | 18/18 | 1/1 | 8/8 | eclipse的使用 |