final
- final是一個關鍵字,意思是不可改變,可以修飾類,方法,變量。
類:被修飾的類,不能被繼承。
方法:被修飾的方法,不能被重寫。
變量:被修飾的變量,隻能指派一次。
格式
//用在類上
final class 類名 {} //不能被繼承
//用在方法:
修飾符 final 傳回值類型 方法名(參數清單){ //方法體 } //不能被重寫
//局部變量(基本類型):
final 變量類型 變量名 = 指派的參數
//局部變量可以通過先定義,後續語句再指派。例:final int X; X=1; //隻能指派一次
//成員變量(基本類型)
final 變量類型 變量名 = 指派的參數
//成員變量可以通過顯示指派和構造方法兩種方式指派。
//注意,如果是通過構造方法,那麼所有構造方法裡面都必須要有指派公式。
命名規範
- 被final修飾的常量名稱,所有字母都大寫
權限修飾符
- public:公共的。
- protected:受保護的
- default:預設的(系統會預設加,除了在接口裡寫預設方法用,在其他地方自己寫就會報錯)
- private:私有的
- 權限修飾符,定義時寫在最前面
注意
(default是預設的,不需要手動添加)
public(所有包中) > protected(如果是子類,所有包,否則目前包) > default(目前包中) > private(目前類)
編寫代碼時,如果沒有特殊的考慮,建議這樣使用權限:
- 成員變量使用private ,隐藏細節。
- 構造方法使用public ,友善建立對象。
- 成員方法使用public ,友善調用方法。
内部類
- 内部類就是一個寫在類中的類
定義格式
class 類A{
class 類B{
}
} //這裡,類B其實就是類A的内部類,類A是類B的外部類
通路特點
- 内部類可以直接通路外部類的成員,包括私有成員
- 外部類要通路内部類的成員,則必須要建立内部類的對象來通路
- 如果子類繼承了父類,那他也繼承了父類的内部類,可以通過子類名.内部類名的方式來定義内部類對象
建立内部類格式
- 外部類名.内部類名 對象名 =new 外部類名().new内部類名()
- 例:類A.類B nbdx = new 類A().new類B(); //這裡,nbdx就是一個新聲明的内部類對象,可以拿來調用内部類的成員和方法
- 如果遇到内部類和外部類成員重名,又想在内部類中調用外部類的成員,這時候可以用:外部類名.this.成員名來調用
-
例:設有name變量,在外部類A和内部類B中都有定義,此時想在内部類中調用外部類的name變量
類A.this.name //此成員就代表外部類A的name
匿名内部類(重點)
在實際使用中,我們經常會遇到想使用一些抽象類或者接口的抽象方法時,此抽象類或者接口的子類的方法沒有重寫或者重寫的方法此時不适用。而我們如果隻是臨時用一下,專門為此去建立一個子類,步驟又很麻煩。此時我們可以用到匿名内部類
定義格式
new 類名/接口名(){
///重寫你想要實作的抽象方法
}
//這裡的(類名/接口名)就是你想要使用的類或者接口的名字,裡面的方法就重寫你現在想要實作的方法
//你也可以直接通過上面的方法建立出的匿名内部類來指派給一個引用
//格式
類名/接口名 nb = new 類名/接口名(){
//重寫的方法體;
}
注意
寫匿名内部類的時候,也要重寫抽象類或者接口裡的所有抽象方法(和普通類一樣)。
是否能建立接口或者抽象類的内部類對象呢?不可以