1. 封裝
封裝的最基本單位是物件,封裝的最基本目標是“高內聚、低耦合”,對于用戶來說,物件是如何對各種行為進行實作是不需要刨根問底了解清楚的,大大地簡化了操作的步驟,使用戶使用起來更加高效、更加得心應手,
一般可以將需要封裝的資料私有化private,然后給用戶提供get/set方法來獲取資料,
2. 繼承
- Java是單繼承
- 繼承好處:提高了代碼的復用性、維護性
- 繼承弊端:類的耦合性增強了
- 繼承體現的關系:is a
- 設計時可以抽象子類的共有特征來構成父類
- this:代表本類當前物件的參考
- super:代表父類物件的參考
- 繼承中變數的訪問順序:
- 子類區域范圍找
- 子類成員范圍找
- 父類成員范圍找
- 如果都沒有就報錯(不考慮父類的父類)
- 繼承中成員方法的訪問順序:
- 子類成員范圍找
- 父類成員范圍找
- 如果都沒有就報錯(不考慮父類的父類)
- 繼承中構造方法的訪問特點:
- 子類中所有構造方法第一條陳述句默認都是:super(),因為子類會繼承父類中的資料,可能還會使用父類中的資料,因此子類初始化之前,一定要先完成父類資料的初始化,
- 若父類中沒有無參構造,只有帶參構造,需要顯示使用super去呼叫父類帶參構造方法,因此創建類時最好都寫上無參構造,
- 方法重寫時子類方法訪問權限不能比父類的低
- 一個類如果沒有父類,默認繼承自Object類
- 運行時,父類先進方法區;父類中的屬性,會跟隨子類物件進入到堆記憶體
3. 多型
- 多型簡單理解:同一個物件在不同時刻表現出不同形態
- 多型的前提和體現:
- 有繼承/實作關系
- 有方法重寫
- 有父(類/介面)參考指向(子/實作)類物件
- 多型好處:提高了程式的擴展性;如在定義方法時,使用父類作為引數,將來使用時用具體子類參與操作
- 多型弊端:不能使用子類特有功能
- 多型中成員的訪問特點:只有運行時的非靜態方法看右邊
- 編譯時:變數和方法都看左邊,因為編譯時右邊new的物件還沒有被調入到堆記憶體,
- 運行時:變數看左邊,靜態方法看左邊,非靜態方法看右邊,因為左邊的宣告型別可能是介面,方法是抽象的,所以運行時方法要看右邊的,
- 向上轉型:子類轉換為父類,父類參考指向子類物件,安全
- 向下轉型:父類轉換為子類,父類參考轉為子類參考,不安全
- instanceof運算子:判斷一個物件是否為一個類的實體
4. 抽象
- 抽象類主要對類進行抽象
- 使用abstract修飾抽象類和抽象方法
- 一個沒有方法體的方法應該定義為抽象方法
- 抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
- 抽象類的子類要么重寫抽象類中的所有抽象方法,要么是抽象類
- 抽象類不能實體化,但有構造方法,用于子類訪問父類資料的初始化
- abstract和final不能同時使用,因為abstract是讓子類重寫,而final是不可重寫
- abstract和private不能同時使用,因為abstract是讓子類重寫,private要求只能本類使用,子類根本繼承不了
- abstract和static不能同時使用,因為abstract是讓子類重寫,static修飾的方法不能被重寫
5. 介面
-
介面主要對行為進行抽象
-
一個類/介面可以同時實作/繼承多個介面
-
介面不能直接實體化,可以通過實作類物件實體化
-
介面的實作類要么重寫介面中的所有抽象方法,要么是抽象類
-
介面沒有構造方法
-
介面中的成員變數只能是常量,默認修飾符為public static final
-
介面中的方法只能是抽象方法,默認修飾符為public abstract
-
介面的組成:
- 常量
- 抽象方法
- 默認方法(Java 8)
- 靜態方法(Java 8)
- 私有方法(Java 9)
-
介面中默認方法不是抽象方法,所以不強制被重寫,但可以被重寫,重寫的時候去掉default關鍵字
介面中默認方法的定義格式: public default 回傳值型別 方法名(引數串列) {} 定義時public可以省略,default不能省略 -
介面中靜態方法只能通過介面名呼叫,不能通過實作類名或者物件名呼叫
介面中靜態方法的定義格式: public static 回傳值型別 方法名(引數串列) {} 定義時public可以省略,static不能省略 -
介面中私有方法:當兩個默認方法或者靜態方法中包含一段相同的代碼實作時,程式必然考慮將這段實作代碼抽取成一個共性方法,而這個共性方法是不需要讓別人使用的,因此用私有給隱藏起來,這就是Java 9增加私有方法的必然性
介面中私有方法的定義格式: 格式1:private 回傳值型別 方法名(引數串列) {} 格式2:private static 回傳值型別 方法名(引數串列) {} 默認方法可以呼叫私有的靜態方法和非靜態方法 靜態方法只能呼叫私有的靜態方法
6. 內部類
-
內部類的訪問特點:
- 內部類可以直接訪問外部類的成員,包括私有
- 外部類要訪問內部類的成員,必須創建物件
-
外界創建非私有的成員內部類:
外部類名.內部類名 物件名 = 外部類物件.內部類物件; 如:Outer.Inner oi = new Outer().new Inner(); -
區域內部類是在方法中定義的類,外界無法直接使用,需要在方法內部創建物件并使用,
-
匿名內部類:本質是一個繼承了該類或者實作了該介面的子類匿名物件
格式: new 類名或介面名() { 重寫方法; }
7. 成員變數和區域變數的區別
| 成員變數 | 區域變數 |
|---|---|
| 在類中,方法外 | 在方法內或方法宣告上 |
| 堆記憶體 | 堆疊記憶體 |
| 隨物件的存在而存在 | 隨方法的呼叫而存在 |
| 有默認值 | 無默認值 |
8. 訪問權限
| 權限 | 同類 | 同包 | 不同包子類 | 不同包非子類 |
|---|---|---|---|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | |
| default(不寫) | √ | √ | ||
| private | √ |
外部類只能用public或default(不寫)這兩種修飾符;內部類四種都可以用
protected權限用法:只能在子類中使用super才能訪問父類
private修飾的方法不能被重寫,因為private修飾的成員只能在本類中訪問
9. static
-
被static修飾的內容在靜態區中,隨著類的加載而加載;不屬于物件,而是屬于類的;凡是本類的物件,都共享同一份,
class Student { private int id; private static int idCounter = 0; // idCounter:學號計數器 public Student() { // 每當new一個新物件時,自動給id賦值 id = ++idCounter; } } -
靜態代碼塊:
-
特點:當第一次用到本類時,靜態代碼塊執行唯一的一次**(無論創建多少物件,只在第一次的時候執行)**
-
典型用途:用來一次性地對靜態成員變數進行賦值
-
靜態內容總是優先于非靜態,所以靜態代碼塊比構造方法先執行
static { // 靜態代碼塊的內容 }
-
-
通過類名訪問靜態成員變數時,全程和物件就沒關系,只和類有關系
-
無論成員變數還是成員方法,如果被static修飾了,都推薦使用類名進行呼叫
-
靜態不能直接訪問非靜態,因為在記憶體中先有靜態,后有非靜態,–>前人不知道后人,但后人知道前人
-
static不可以修飾區域變數,因為靜態成員屬于類,不屬于方法
-
靜態方法不能使用this,因為this代表當前物件,通過誰呼叫的方法,誰就是物件,但是靜態卻與物件沒關系
-
靜態方法可以被繼承,但是不能重寫,如果父類中有一個靜態的方法,子類也有一個與其方法名引數串列相同靜態方法,那么該子類的方法會把原來然承過來的父類的方法隱藏,而不是重寫,
-
靜態內部類可以定義靜態和非靜態的方法和屬性,而非靜態內部類只能定義非靜態方法和屬性,因為非靜態內部類在創建物件時才出現,若內部有靜態成員,則該靜態成員需在創建物件前就出現,相互矛盾,
-
靜態屬于類,不屬于物件,因此靜態不能物件序列化
10. final
-
被final修飾的類不能被繼承;一個類如果是final的,那么其中所有成員方法都無法被覆寫重寫(因為沒兒子)
// 格式 權限修飾符 final class 類名稱 { } -
被final修飾的方法不能被覆寫重寫
// 格式 權限修飾符 final 回傳值型別 方法名(引數串列) { } -
被final修飾的區域變數不可改變,一次賦值,終生不變,對于基本型別來說,不可變指變數中的資料不可改變;對于參考型別來說,不可變指變數的地址不可改變
// 格式 只保證有唯一一次賦值即可 final 資料型別 變數名; -
被final修飾的成員變數同樣不可變且沒有默認值
- 被final修飾的成員變數,要么直接賦值,要么通過構造方法賦值,二者選其一,
- 如果選擇使用構造方法賦值,那么必須保證類中所有多載的構造方法,都對被final修飾的成員變數賦值,
- 被final修飾的成員變數,不能有set方法,
若有錯誤或補充,歡迎私信
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/198597.html
標籤:其他
