如若文章中出現衝突,或者出現錯誤,請聯繫 QQ:2669157689 指出我的問題。謝謝~
介紹Java中類的繼承,封裝,多態,方法的覆蓋,抽象類、接口及內部類等面向對象的高級特性。通過本課的學習,我們應該掌握如下知識:
- 類的繼承、封裝、多態
- 抽象類及接口
- 引用數據類型的轉換
- 訪問權限修飾符的使用
- 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中,包主要有以下用途 :
- 包允許將類組合成較小的單元
- 有助於避免命名衝突
- 包允許在更廣的範圍內保護類、數據和方法
- 包可以是類、接口和子包的集合
- 在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) — 子類轉換爲父類,自動轉換
- 前提 — 具有繼承或實現關係
- 向上轉換損失了子類新擴展的屬性和方法,僅可以使用從父類中繼承的屬性和方法
- 向上轉型 (Upcasting) — 子類轉換爲父類,自動轉換
② 下溯造型
- 引用數據類型的轉換
- 向下轉型 (Downcasting):強制轉換
- 將父類對象顯示的轉換成子類類型
- 向下轉型 (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(); //實例化內部類
- 在 Outer 內訪問 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);
}
}
}
}
小結
- 類的繼承:子類的構造器
- Java 中的包和訪問修飾符
- 方法的覆蓋
- 引用數據類型的轉換:向下轉型、向上轉型
- 多態:特徵、動態綁定
- 抽象類和接口:定義、抽象方法、區別
- Final關鍵字
- 內部類
加油基礎知識快學完了, 我覺得這篇相對於前邊幾篇來說格式更好了