面向對象進階第二天 許可權修飾符 作用:約束成員變數,構造器,方法等的訪問範圍 自己定義成員(方法,成員變數,構造器等)一般需要滿足如下要求: 成員變數一般私有。 方法一般公開。 如果該成員只希望本類訪問,使用private修飾。 如果該成員只希望本類,同一個包下的其他類和不同包下的子類訪問,使用pr ...
許可權修飾符
作用:約束成員變數,構造器,方法等的訪問範圍
自己定義成員(方法,成員變數,構造器等)一般需要滿足如下要求:
-
成員變數一般私有。
-
方法一般公開。
-
如果該成員只希望本類訪問,使用private修飾。
-
如果該成員只希望本類,同一個包下的其他類和不同包下的子類訪問,使用protected修飾。
-
final最終的意思
-
final修飾類:類不能被繼承。工具類可以用final修飾。
-
final修飾方法:該方法被稱為最終方法,特點是不能被重寫了。 模板方法可以用final
-
final修飾變數:總規則:有且僅能被賦值一次。
註意:final修飾基本數據類型的變數,其存儲的數據不能改變。final修飾引用類型的變數,其存儲的地址不能改變,但是指向的對象內容可以改變。
常量
-
是什麼?
-
public static final 修飾的成員變數,必須有初始化值,執行過程中值不能改變。
-
-
作用:做系統的配置信息,做信息標誌和分類
-
規範:名稱全部大寫,多個單詞用下劃線連接
-
常量在編譯階段會進行“巨集替換”:把使用常量的地方全部替換成真實的字面量
-
// 請在下方聲名一個常量VERSION_NAME,值為"v1.0.0",用於記錄系統的版本名稱。 public static final String VERSION_NAME = "v1.0.0";
抽象類
抽象類是什麼?abstract修飾的類
抽象方法是什麼?abstract修飾的方法,不能寫方法體。
作用:
-
被子類繼承。
-
如果父類知道子類一定要做這件事,但是每個子類做的不一樣,父類可以聲明抽象方法,交給子類重寫來實現。這個類就是抽象類了。
抽象類的特點:
-
類有的成員(成員變數、方法、構造器)抽象類都具備
-
抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
-
一個類繼承了抽象類必須重寫完抽象類的全部抽象方法,否則這個類也必須定義成抽象類。
-
不能用abstract修飾變數、代碼塊、構造器。
-
最重要的特征:得到了抽象方法,失去了創建對象的能力(有得有失)
模板方法設計模式
-
模板方法模式解決了什麼問題?
-
提高了代碼的復用性
-
模板方法已經定義了通用結構,模板方法不能確定的部分定義成抽象方法,交給子類實現,因此,使用者只需要關心自己需要實現的功能即可。
-
模板方法模式中的通用結構建議加上final修飾,好處是可以防止子類重寫模板方法。
-
多態
面向對象的三大特征之一:封裝、繼承、多態
含義? 指的是對象有多種形態
-
人類型的對象:學生對象
-
人類型的對象:老師對象
-
人類型的對象:丈夫對象
語法形式:
-
父類類型 變數名稱 = new 子類構造器;
Animal a = new Cat();
-
介面 變數名稱 = new 實現類構造器;
多態的調用方式
-
對於方法的調用:編譯看左邊,運行看右邊
Animal a = new Cat();
a.run(); -
對於變數的調用
-
編譯看左邊,運行也看左邊(註意)
-
-
多態更多用在行為多態
多態的使用前提
1、必須繼承、實現
2、父類類型的變數指向子類類型的對象
Animal a = new Cat();
3、存在方法重寫
Animal a = new Cat();
a.run();
多態的優勢
-
a、多態可以實現解耦合
Animal a = new Dog();
a.run(); -
b、多態下,父類類型作為方法的入參,可以接收一切子類對象,這樣更利於方法的擴展和便利性。
-
註意存在的問題:
-
多態下不能直接訪問子類獨有功能
Animal a = new Dog();
a.lookDoor();
-
多態下類型轉換問題
-
自動類型轉換
-
從子類到父類
Animal a = new Dog();
-
強制類型轉換
-
從父類到子類
-
Animal a = new Dog();
-
必須強制類型轉換,否則報錯的
-
Dog d = (Dog) a;
-
註意:
-
Java規定,有繼承/實現關係的類就可以強制轉換,編譯階段不會報錯。但是運行時可能出現類型轉換異常,ClassCastException。
Animal a = new Cat();
Dog d = (Dog)a; -
編譯不出錯。運行時出現類型轉換異常。
-
-
Java建議在進行強制轉換之前先通過instanceof判斷真實數據類型,再強轉
Animal a = new Cat();
if(a instanceof Cat) {
Cat c = (Cat)a;
} -
強制類型轉換解決了什麼問題?
-
可以調用子類的獨有功能了
-
介面
介面概定義與特點
-
Java提供了一個關鍵字interface,用這個關鍵字我們可以定義出一個特殊的結構:介面。
public interface 介面名 {
// 成員變數(常量)
// 成員方法(抽象方法)
}JDK8之前介面中只能是常量和抽象方法,沒有其他成分了。
介面本質上是一種規範,約束實現介面的類必須具備某種能力。
-
註意:介面不能創建對象;介面是用來被類實現(implements)的,實現介面的類稱為實現類。
修飾符 class 實現類 implements 介面1, 介面2, 介面3 , ... {
} -
一個類可以實現一個或多個介面,實現類實現多個介面,必須重寫完全部介面中的全部抽象方法,否則實現類需要定義成抽象類。
介面與介面的關係:多繼承
-
一個介面可以同時繼承多個介面
註意:實現子介面名的類必須實現後面所有介面中的所有抽象方法。
-
介面多繼承的作用
-
規範合併,整合多個介面為同一個介面,便於子類實現。
-
繼承抽象類的同時實現多個介面
-
類和類的關係
-
單繼承
-
-
類和介面的關係
-
多實現
-
-
因此,我們可以在繼承類的同時,實現1個或多個介面,語法如下:
修飾符 class 實現類 extends 基類名 implements 介面1, 介面2, 介面3 , ... {
}
使用介面的好處
-
彌補了類單繼承的不足,一個類在單繼承的同時還可以實現多個介面。
-
讓程式可以面向介面編程,這樣程式員就可以靈活方便的切換各種業務實現(多態思想)。
JDK8開始介面新增的方法
-
預設方法
-
類似之前寫的普通實例方法:必須用default修飾
-
預設會public修飾。需要用介面的實現類的對象來調用
default void defaultMethod() {
System.out.println("介面中的預設方法");
}
-
-
靜態方法
-
預設會public修飾,必須static修飾。
-
註意:介面的靜態方法必須用本身的介面名來調用。
static void staticMethod() {
System.out.println("介面中的靜態方法");
}
-
-
私有方法
-
必須使用private修飾,從JDK1.9才開始有的。
-
根據是否有static關鍵字修飾,私有方法可以分為非靜態私有方法和靜態私有方法。
-
非靜態私有方法只能在本類中被其他的預設方法或者私有方法訪問。
-
靜態私有方法還能在本類的其他靜態方法中訪問。
private void privateMethod() {
System.out.println("介面中的私有方法");
}
-
使用介面的註意事項
-
介面不能創建對象
-
一個類實現多個介面,多個介面的規範不能衝突
-
一個類實現多個介面,多個介面中有同樣的靜態方法不衝突。
-
一個類繼承了父類,同時又實現了介面,父類中和介面中有同名方法,預設用父類的。
-
一個類實現了多個介面,多個介面中存在同名的預設方法,可以不衝突,這個類重寫該方法即可。
-