(內部類,許可權修飾符,多型,抽象類)2020.10.22
目錄
內部類
定義:將一個類定義到另一個類的裡邊,裡邊的類就稱為叫做內部類,內建類。
將內部類定義在它所屬的類中,類中分為成員位置和區域性位置,因此
按照位置劃分: 成員內部類和區域性內部類。
按照內部類是否有類名劃分:有名內部類和匿名內部類
成員內部類
結構:
class 外部類名 {
class 內部類名 {
}
}
將類定義在成員位置上,因此該類可以使用成員修飾符進行修飾。
預設內部類:
類中可以定義的成員有:
非靜態成員、靜態常量
類中可以直接訪問它所屬的外部類中的成員:
私有、靜態的、非私有非靜態
私有內部類:
使用方式與預設內部類時相同的,只不過在內部類前使用private關鍵字修飾了,因此
該內部類只能在它所屬的外部類中使用,即提供一個方法,在方法中建立內部類物件。
靜態內部類:
就是內部類前使用關鍵字static修飾了。
在該內部類中:既可以定義靜態成員也可以定義非靜態成員。
區域性內部類:
結構:
class 外部類名 {
public void 方法名(){
class 內部類名 {
}
}
將內部類定義在區域性位置上,即方法中。
總結:
創不建立物件,取決於類中的成員是否是靜態。
包
概念:
1.用來分類管理類檔案(包可以形象化為電腦中的資料夾)
2.class檔案與Java原始檔相分離
3.在不同包中出現同名的類
格式:
package 包名;
注意:這條語句在一個Java中檔案只能出現1次
這條語句必須寫在有效程式碼行的最上邊
包名:通常都是小寫單詞或小寫字母。
規範: 公司域名倒置.專案名.模組名.[子模組]*;
eg: com.ujiuye.cms.login;
注意: 一旦定義了package語句,那麼類名的完整形式為:包名.類名
帶包執行: java 包名.類名
當定義了package,類名的完整形式有點長,倒置建立物件時編寫也有點長,因此想要簡化程式碼,可以使用import關鍵字來簡化,是一個導包的語句。
格式:
import 包名.類名; 推薦 或 import 包名.*;
位置: 在package 和 class 的中間,可以出現多次。
建立物件時,可以省略”包名.”。
注意:在不同包中使用時,同一包中不需要import
總結:
package : 告訴編譯器,當前類要儲存在哪
import :告訴編譯器,當前類中使用的其他類去哪找
訪問許可權修飾符
指的是類中的成員能被訪問的許可權。
由小到大: private 預設 protected public
當前類 | 同包下 | 不同包子類(繼承) | 所有 | |
---|---|---|---|---|
private | √ | |||
預設 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
以後定義成員時,選擇合適的修飾符來修飾,控制訪問的許可權。
多型
面向物件的特徵:封裝、繼承、多型
理解:一個物件具有多種形態。
站在物件的角度來看,可以使用不同型別的引用變數來指向。
站在引用變數的角度來看,該引用變數可以指向不同型別的物件。
前提:必須有繼承或實現。
表現:父型別引用指向(接收)它自己的子類物件。
多型形式訪問類中的成員方法時(虛擬呼叫):
編譯時期:要檢查引用變數所屬的型別中,是否有要呼叫的方法,有編譯通過,否則失敗。
執行時期:執行的是物件型別中的該方法。
總結:編譯看父類,執行看子類。
好處:
提高了程式碼的擴充套件性 ,代表案例方法引數
轉型問題:
向上轉型
(基本型別的自動轉換) 父型別引用變數指向子類物件。
向下轉型
(基本型別的強制轉換) 將父型別引用變數轉為子型別引用變數,
格式:(子類型別)父型別引用變數
以上兩行程式碼編譯是沒有問題的,但是執行會出現異常。
型別轉換異常,不能將Animal1 轉為 Cat1型別。
總結:做轉型時,一定是子類物件的引用變數的型別在改變,一會是父型別引用,一會是自己型別的引用,由始至終物件一直是子類物件。
instanceof
運算子,比較運算子,運算後的結果是boolean型別。
比較左邊的引用變數所指向的物件是否是右邊的型別,即判斷兩邊型別是否一致。
注意:如果判斷的型別有父子關係,一定是先判斷子型別最後是父型別,
如果是兄弟關係沒有順序了。
抽象類
也是類,只不過是一個特殊的類,這個類有點強制性的感覺。
由來:
當描述Cat類和Dog類時,發現有共性的方法宣告,即eat()方法,將共性內容進行向上抽取,抽取到父類Animal中,但是隻能抽取方法的宣告,因此這個方法是沒有方法體的方法,需使用關鍵字abstract,這樣的方法稱為叫做抽象方法,抽象方法要在抽象類中。
abstract
抽象的意思,是一個修飾符。可以修飾類和方法。
格式:
abstract class 類名{}
特點:
1.抽象方法要在抽象類中
2.抽象類是不可以例項化的,即不能建立物件
3.抽象類應該是一個父類,子類繼承抽象類,子類想要能建立物件,需將繼承的所有抽象方法都重寫,否則子類是抽象類。
因此一個類的修飾符,不可能final和abstract都有
4.抽象類中可以沒有抽象方法,目的就是不讓其例項化
成員:
抽象方法、成員變數、構造方法、成員方法
注意:抽象類中的成員可以是以上的四種內容,不是要求都同時存在的。