永不服輸的Java之路---重學Java (第七章)

如若文章中出現衝突,或者出現錯誤,請聯繫 QQ:2669157689 指出我的問題。謝謝~

介紹Java中類的繼承,封裝,多態,方法的覆蓋,抽象類、接口及內部類等面向對象的高級特性。通過本課的學習,我們應該掌握如下知識:

  1. 類的繼承、封裝、多態
  2. 抽象類及接口
  3. 引用數據類型的轉換
  4. 訪問權限修飾符的使用
  5. final關鍵字

JAVA編程基礎 —— 面向對象高級特性

1. 類的繼承

① 類的繼承

  • 在 Java 中定義一個類時,讓該類通過關鍵字 extends 繼承一個已有的類,這就是類的繼承(泛化)
  • 被繼承的類稱爲父類(超類,基類),新的類稱爲子類(派生類)
  • 子類繼承父類的所有屬性和方法,同時也可以增加自己的屬性和方法

② 繼承的語法和規則

  • 繼承的語法
    [修飾符] class 子類名 extends 父類名
  • 繼承的優點:使編碼更高效、易維護、代碼的重用
  • 繼承的規則:
    • Java中只支持單繼承,也就是說每個類只能有一個父類,不允許有多重繼承
    • 一個父類可以有多個子類
    • 子類繼承父類所有的屬性和方法

③ 子類實例化的過程

  • 子類實例化時先實例化其父類,然後實例化子類
  • 要先調用父類的構造器,父類構造器運行完畢,才調用子類的構造器
  • 子類的構造器 — 子類不能繼承父類的構造器
    • 使用默認的構造器.
    • 在子類中的創建構造器
      • 在子類中創建構造器時,必須調用父類的構造器
      • 子類可以在自己的構造器中使用 super 關鍵字來調用父類的構造器 super (參數1,參數2,…);
      • 如果使用super關鍵字調用父類構造器,必須寫在該子類構造器的第一行
      • 如調用的是父類中無參的構造器,則可以不寫 super()
      • 如果子類中調用了父類無參的構造器,而父類中沒有無參構造器則系統編譯出錯

④ super和this關鍵字

  • super()
    • 作用:調用父類的構造器、指向父類的引用
    • 只能出現在子類的構造器中,且必須是第一行
    • super() 中的參數,決定了調用父類哪個構造器
    • 如果子類構造器中沒有出現 super,那麼編譯器會默認加上 super(),即調用父類的空構造器,如果父類沒有空構造器,編譯器提示錯誤
  • this()
    • 作用:調用本類的構造器、指向本類的引用
    • 只能寫在構造器的第一行
  • 在同一個構造器中 super()this() 不能同時出現

2. Java包的概念

① Java中的包

  • 包的概念及應用
    • 在Java中,包主要有以下用途 :
      • 包允許將類組合成較小的單元
      • 有助於避免命名衝突
      • 包允許在更廣的範圍內保護類、數據和方法
    • 包可以是類、接口和子包的集合
  • 包的概念及應用
    • 將類放入包中
      package 包名;
    • 注意:
      • 在 java 中位於包中的類,在文件系統中的存放位置,必須有與包名層次相對應的目錄結構
      • package 語句作爲 java 源文件的第一條語句
      • 每個源文件只能聲明一個包
      • 如果沒有 package 語句,則默認爲無名包

② Java中常用的包

  • java.lang — Java語言包,任何程序中,該包都被自動導入
  • java.awt — 圖形用戶界面包
  • java.awt.event — 圖形用戶界面事件處理包
  • java.swing — 跨平臺輕量級組件包
  • java.sql — 數據庫訪問包
  • java.io — 這個包由對您的輸入/輸出操作有用的類組成
  • java.util — 該包提供了許多創建如:lists, calendar,date 等所需要的類和接口
  • java.net — 該包提供了許多進行 TCP / IP 網絡編程的類和接口

③ import導入包中的類

  • 訪問其它包中的類
    • 包名.路徑名
      package test; class Cat extends p08.Animal{…}
    • 使用import關鍵字引入其它包中的類
      package test; import p08.Animal; class Cat extends Animal{…}
    • 位於同一包中的類可以直接訪問
    • 導入包中所有的類
      import 包名.*;
    • 導入子包中所有的類
      import 包名.子包名.*;
    • 導入包中的某個類
      import 包名.子包名.類名;

3. 訪問權限修飾符

① 封裝:隱藏屬性、方法或實現細節的過程稱爲封裝

  • 信息隱藏,隱藏對象的實現細節,不讓用戶看到
  • 將東西包裝在一起,然後以新的完整形式呈現出來
    • 例如,兩種或多種化學藥品組成一個膠囊
    • 將方法和屬性一起包裝到一個單元中,單元以類的形式實現
  • 封裝的目的
    • 隱藏類的實現細節
    • 讓使用者只能通過事先定製好的方法來訪問數據,可以方便地加入控制邏輯,限制對屬性的不合理操作
    • 便於修改,增強代碼的可維護性
    • 可進行數據檢查

② 訪問權限修飾符

  • 用來控制類的成員和類的使用範圍
    • 類成員的訪問權限修飾符:private、default、protected、public
    • 類的訪問權限修飾符:public、default

4. 方法的覆蓋

① 方法的覆蓋 (override)

  • 重寫 (rewrite)
  • 對從父類中繼承來的方法進行改造
  • 在子類繼承父類時發生

② 方法覆蓋的規則

  • 在子類中的覆蓋方法與父類中被覆蓋的方法應具有
    • 相同的方法名
    • 相同的參數列表 (參數數量、參數類型、參數順序都要相同)
    • 相同的返回值類型
    • 子類覆蓋方法的訪問權限要不小於父類中被覆蓋方法的訪問權限

5. 引用類型的轉換

① 上溯造型

  • 引用數據類型的轉換(對象造型)
    • 向上轉型 (Upcasting) — 子類轉換爲父類,自動轉換
      • 前提 — 具有繼承或實現關係
      • 向上轉換損失了子類新擴展的屬性和方法,僅可以使用從父類中繼承的屬性和方法

② 下溯造型

  • 引用數據類型的轉換
    • 向下轉型 (Downcasting):強制轉換
      • 將父類對象顯示的轉換成子類類型

③ instanceof 運算符

  • instanceof 運算符
    • 判斷一個類是否實現了某個接口:對象 instanceof 接口
    • 判斷一個實例對象是否屬於一個類:對象 instanceof 類
    • 它的返回值是boolean型的

6. 多態

① 多態

  • 簡單來說,多態是具有表現多種形態的能力的特徵
  • 同一個實現接口,使用不同的實例而執行不同操作
  • 多態 (動態綁定、Polymorphism)
    • 不同的對象對同一行爲作出的不同響應
    • 多態存在的三個必要條件
      • 要有繼承,或實現
      • 要有重寫
      • 父類引用指向子類對象

一旦滿足以上3個條件,當調用父類中被重寫的方法後,運行時創建的是哪個子類的對象,就調用該子類中重寫的那個方法

  • 在執行期間 (而非編譯期間) 判斷所引用對象的實際類型,根據其實際類型調用相應的方法
  • 多態的優點
    • 簡化代碼
    • 改善代碼的組織性和可讀性
    • 易於擴展

7. 抽象類

** ① 抽象類**

  • 抽象類
    • 抽象類是抽象方法和非抽象方法的集合
      [訪問權限修飾符] abstract class 類名 {……}
    • 特殊情況
      • 全部是抽象方法
      • 全部爲非抽象方法

② 抽象方法

  • 只有方法聲明,沒有方法實現的方法
    [訪問權限修飾符] abstract 返回值類型 抽象方法名 (參數列表) ;

③ 抽象類的規則

  • 抽象類
    • 注意:
      • 抽象類不能被實例化;
      • 其包含的抽象方法必須在其子類中被實現,否則該子類只能聲明爲 abstract;
      • 抽象方法不能爲 static;
    • 在下列情況下,一個類必須聲明爲抽象類:
      • 當一個類的一個或多個方法是抽象方法時;
      • 當類是一個抽象類的子類,並且沒有實現父類的所有抽象方法,即只實現部分;
      • 當一個類實現一個接口,並且不能爲全部抽象方法都提供實現時;

8. 接口

① 接口 (interface)

  • 接口的聲明
    interface Runnable { public abstract void run(); }
    • 接口中只包含常量和抽象方法,而沒有變量和方法的實現
      [訪問權限修飾符] interface 接口名 {接口的成員}
    • 接口的成員:
      • 常量(字段)
      • 抽象方法
  • 注意:
    • 接口不是一個類,沒有構造器,不能被實例化
    • 接口使用 interface 關鍵字來定義,而不是 class
    • 接口默認:
      • 常量:public static final
      • 抽象方法: public abstract
  • 擴展接口 (接口的繼承)
  • 接口的意義
    • 接口可以實現多繼承
      • 用接口可以實現混合類型 (主類型,副類型),java 中可以通過接口分出主次類型
      • 主類型使用繼承,副類型,使用接口實現
    • 接口可以使方法的定義和實現相分離,降低模塊間或系統間的耦合性
      • 針對接口編程可以屏蔽不同實現間的差異,看到的只是實現好的功能

② 接口和類的關係

  • 類實現接口 — implements
    • 爲了使用一個接口,你要編寫實現接口的類
    • 如果一個類要實現一個接口,那麼這個類就必須實現接口中所有抽象方法。否則這個類只能聲明爲抽象類
    • 多個無關的類可以實現一個接口,一個類可以實現多個無關的接口
    • 一個類可以在繼承一個父類的同時,實現一個或多個接口
  • 類的單繼承與多實現
  • 類實現接口
    • 示例:
      • 有一個Student類
      • 該類繼承了Person類,並實現了Consumer接口
      • 該類具有String類型的屬性school
      • 並有一個study方法,在該方法中,系統可打印出學生在那所學校學習
      • 並創建一個測試方法,測試Student類

        ③ 接口與抽象類的區別
  • 接口不能含有任何非抽象方法,而抽象類可以
  • 類可以實現多個接口,但只能有一個父類
  • 接口不是類分級結構的一部分,沒有聯繫的類可以實現相同的接口

9. final關鍵字

final 關鍵字

  • final 可以修飾的元素
    • 類:不能被繼承
    • 變量(屬性和局部變量):不能被重新賦值
      • 在聲明時賦值,或在構造器中賦值
      • 系統不會對 final 屬性默認的賦初始值
    • 方法:不能在子類中被覆蓋,即不能修改

10. 內部類

① 內部類

  • 內部類 (嵌套類)
    • 內部類就是定義在另一個類內部的類
    • 內部類對於同一包中的其它類來說,內部類能夠隱藏起來
  • 注意
    • 內部類可以訪問其外部類中所有的屬性和方法
    • 無需創建外部類的對象,即可從內部類訪問外部類的變量和方法
    • 必須創建內部類的對象,否則無法從外部類訪問內部類的變量和方法
    • 如果內部類中有和外部類同名的變量或方法,則內部類的變量和方法將獲得比外部類的變量和方法更高的優先級
    • 不能定義 static 變量
  • 類中定義的內部類
    • 普通類的訪問權限修飾符
      • default
      • public
    • 內部類的訪問權限修飾符
      • default
      • public
      • protected
      • private
  • 內部類的訪問
    • 在 Outer 內訪問 Inner,只需如下:
      Inner in = new Inner();
    • 在Outer外訪問Inner,必須如下:
      Outer o = new Outer(); //實例化外部類
      Outer.Inner oi = o.new Inner(); //實例化內部類

② 靜態內部類

  • 用static標識的內部類爲靜態內部類
  • 靜態內部類作爲外部類的靜態成員,不能訪問外部類非靜態成員
  • 非靜態內部類只能定義非靜態成員,而靜態內部類可以定義靜態成員和非靜態成員
  • 使用 Outer.Inner in = new Outer.Inner() 方式實例化靜態內部類
  • 非靜態內部類不可以使用上面的方式實例化

③ 局部內部類

  • 局部內部類
    • 在一個類的方法體中或程序塊內定義的內部類
    • 示例:在方法定義的內部類中只能訪問方法中的 final 類型的局部變量
public class Outer2 {
	public int a = 1;
	private int b = 2;
	public void method(final int c) {
		int d = 3;
		final int e = 2;
		class Inner {
			private void iMethod(int e) {
				//System.out.println(e);
			}
		}
	}
}

小結

  1. 類的繼承:子類的構造器
  2. Java 中的包和訪問修飾符
  3. 方法的覆蓋
  4. 引用數據類型的轉換:向下轉型、向上轉型
  5. 多態:特徵、動態綁定
  6. 抽象類和接口:定義、抽象方法、區別
  7. Final關鍵字
  8. 內部類

加油基礎知識快學完了, 我覺得這篇相對於前邊幾篇來說格式更好了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章