final關鍵字
(1)最終的意思,可以修飾類,方法,變量。
(2)特點:
a:它修飾的類,不能被繼承
b:它修飾的方法,不能被重寫
c:它修飾的變量,是一個常量
(3)面試相關:
a:final修飾變量
基本類型:值不能發生改變
引用類型:位址值不能發生改變,但是對象的内容可以發生改變
b:初始化時機
a:隻能初始化一次
b:常見的給值
1.定義的時候(推薦)
2.構造方法中(非靜态常量)
class Demo {
final int num;
final int num2;
static final int num3 = 30;//放在構造方法中會報錯
public Demo() {
num = 10;
num2 = 20;
}
}
多态
(1)同一個對象在不同時刻展現出來的不同狀态
(2)多态的前提:
a:有繼承或者實作關系
b:有方法重寫
c:有父類或者父接口引用指向子類對象
多态的分類:
a:具體類多态
class Fu{ }
class Zi extends Fu
Fu f = new Zi();
b:抽象類多态
abstract class Fu{ }
class Zi extends Fu
Fu f = new Zi();
c:接口多态
interface Fu{ }
class Zi implements Fu{ }
Fu f = new Zi();
(3)多态中成員通路特點
a:成員變量
編譯看左邊,運作看左邊
b:構造方法
子類的構造方法都會預設通路父類的構造
c:成員方法
編譯看左邊,運作看右邊
d:靜态方法
編譯看左邊,運作看左邊
為什麼?
因為成員方法有重寫。
(4)多态的好處:
A:提高代碼的維護性(繼承展現)
B:提高代碼的擴充性(多态展現)
(5)多态的弊端:
父不能使用子的特有功能。
現象:子可以當父使用,父不能當子使用
(6)多态中的轉型
a:向上轉型
從子到父,父類引用指向子類對象
Fu f = new Zi( );
b:向下轉型
從父到子,父類引用轉為子類對象
Zi z = (Zi)f;//要求該f必須是能夠轉換為Zi的
抽象類
(1)把多個共性的東西提取到一個類中,這是繼承的做法。
但是呢,這多個共性的東西,在有些時候,方法聲明一樣,但是每個具體的對象在具體實作的時候内容不一樣。是以,我們在定義這些共性方法的時候,就不能給出具體的方法體。而一個沒有具體的方法體的方法是抽象的方法。而一個類中如果有抽象方法,該類就必須定義為抽象類。
(2)抽象的特點
a:抽象類和抽象方法必須用關鍵字abstract修飾
b:抽象類不一定有抽象方法,但是有抽象方法的類一定是抽象類。
c:抽象類不能執行個體化
d:抽象類的子類
抽象類:
具體類:必須重寫抽象類中所有的抽象方法。
(3)抽象類的成員特點
a:成員變量
可以是變量,也可是常量
b:構造方法
有構造方法
c:成員方法
有抽象,有非抽象
(4)抽象類的幾個小問題
A:抽象類有構造方法,不能執行個體化,那麼構造方法有什麼用?
用于子類通路父類資料的初始化。
B:一個類如果沒有抽象方法,卻定義為抽象類,有什麼用?
為了不讓建立對象。
C:abstract不能和哪些關鍵字共存
a:final 沖突
b:private 沖突
c:static 無意義
接口
(1)接口:擴充出來的功能
(2)特點
a:接口用關鍵字interface修飾
interface 接口名{ }
b:類實作接口用implements修飾
class 類名 implements 接口名{ }
c:接口不能執行個體化
d:接口的實作類
a:是一個抽象類
b:是一個具體的類,這個類必須重寫接口中的所有抽象方法
(3)接口的成員特點
a:成員變量
隻能是常量
預設修飾符:public static final
b:構造方法
沒有構造方法
c:成員方法
隻能是抽象的
預設修飾符:public abstract
(4)類與類,類與接口,接口與接口
a:類與類
繼承關系,隻能單繼承,可以多層繼承
b:類與接口
實作關系,可以單實作,也可以多實作
還可以在繼承一個類的同時,實作多個接口
c:接口與接口
繼承關系,可以單繼承,也可以多繼承
(5)抽象類和接口的差別
A:成員差別
抽象類:
成員變量:可以變量,也可以常量
構造方法:有
成員方法:可以抽象,也可以非抽象
接口:
成員變量:隻可以常量
構造方法:無
成員方法:隻可以抽象
B:關系差別
類與類
繼承,單繼承
類與接口
實作,單實作,多實作
接口與接口
繼承,單繼承,多繼承
C:設計理念的差別
抽象類 被繼承展現的是:”is a"的關系。抽象類中定義的是該繼承體系的共性功能。
接口 被實作展現的是:"like a"的關系。接口中定義的是繼承體系中的擴充功能。