【Java基礎】面向對象特性

面向對象的特徵

面向對象的主要特徵包括:抽象,繼承,封裝,多態
1. 抽象:忽略主題中與當前目標無關的方面,值注意與目標有關的方面(抓住主要矛盾或者主要特徵),包括數據抽象和過程抽象
2. 繼承:用於表述類的共性,是一種聯結類的層次模型
3. 封裝:將客觀事物抽象爲類,每個類對自身的方法和數據進行保護。通過權限修飾符確定哪些屬性或方法可以被外界訪問
4. 多態:允許不同類的對象對同一個消息做出響應

繼承的特性以及繼承和組合的區別

繼承:使用extern實現,使得子類擁有和父類一樣方法和變量,主要特性:
1. Java不支持多繼承
2. 子類只能繼承父類的非私有(public protected)的成員變量和方法
3. 子類成員變量和父類成員變量同名的時候,父類成員變量會被覆蓋
4. 子類的成員方法和父類成員方法簽名相同(方法名以及參數表相同)的時候,父類的成員方法也是被覆蓋

組合是在新類裏面創建原有類的對象,重複使用已有類的功能。組合是經常被使用到的,只是很少注意到。
組合和繼承的區別:組合通常也被看做是has-a關係而繼承被看做是is-a關係

Java中多態實現機制

  1. 方法重載: 重載是指同一個類有多個同名方法,但是方法的參數表不同。由於參數不同,在編譯期就可以確定到底是使用哪一個方法,因此屬於編譯時多態
  2. 方法覆蓋:子類覆蓋父類方法,也就是同樣的方法在子類和父類中是具有不用的邏輯的。基類的引用型可以指向基類對象和子類對象,接口引用型可以指向其實現類變量。程序在編譯的時候並不能確定到底是調用哪一個方法,因此只有執行期的時候纔可以動態綁定(將方法調用和方法主體聯繫起來)。由於只有在執行期才能知道到底執行哪個方法,因此方法覆蓋實現的多態稱爲運行時多態

Java中重載和覆蓋的區別

重載是在一個類中的多態性,通過在一個類中定義同名方法實現。(子類繼承父類方法後也是而已對繼承的方法進行重載,但是private 修飾的方法不能被子類重載,因爲子類無法繼承該類;不能通過返回值或訪問權限或異常拋出類型來實現重載)。

覆蓋是派生類和基類之間的多態。同樣基類中private方法不能被覆蓋(無法被繼承);子類實現覆蓋,必須保證方法名,返回值,參數表,拋出異常類型是一致的。

兩者的區別:
1. 覆蓋是子類和父類之間,垂直關係;重載是類中方法之間的關係,水平
2. 覆蓋需要參數列表是一樣的而重載需要時不一樣的
3. 覆蓋是通過調用者的不同來區別的,而重載是根據調用時的參數不同來區別的

抽象類與接口

抽象類:一個類中包含抽象方法就稱爲抽象類,通過abstract關鍵字實現。只要包含了抽象方法的類就必須聲明爲抽象類,抽象類被實現的時候,訪問權限必須相同或者更低(public -> protected -> private),抽象類不能實例化
接口:抽象方法的集合,方法都是沒有方法體的,通過interface關鍵字實現。接口可看做是抽象類的特例,所有方法都是抽象的。

相同點:
1. 都不能被實例化
2. 子類或者實現類都只有在實現了所有的抽象方法之後纔可以被實例化

不同點:
1. 接口只有方法定義沒有實現,抽象類既可以有方法的定義也可以有方法的實現
2. 一個類可以實現多個接口但是隻能繼承一個抽象類
3. 接口強調特定功能的實現,是has-a關係,而抽象類強調所屬關係,是is-a關係
4. 接口中的變量默認是public static final,且只能有靜態final的成員變量,且必須被賦值,方法必須是public abstract。而抽象類就和普通類類似,但是抽象類的抽象方法不能被private, static, synchronized, native等修飾。

抽象類多用於在同類事物中有無法具體描述的方法的時候以及子類和父類存在一定的層次結構的時候使用;而接口多用於不同類之間,所以用於需要支持差別較大的兩個或者更多對象之間的特定的交互行爲時使用。

補充:
接口可以繼承抽象類,抽象類可以實現接口;抽象類可以繼承具體類

內部類

定義在一個類的內部的類型稱爲是內部類,內部類可以看做是一個類的成員(可以被等價看做外部類的一個成員變量)。
分類:
1. 靜態內部類:class outer{ static class inner{}}
2. 成員內部類: class outer{ class inner{}}
3. 局部內部類: class outer{ public void func(){class inner{} } }
4. 匿名內部類: class outer{ public void func(new anonymousInner(){ … }); }

靜態內部類如同一個類的靜態屬性一樣,不依賴與類的實例而進行實例化。靜態內部類不能與外部類名字相同,不能訪問外部類的非靜態成員,只能訪問外部類的靜態成員或方法(包括private)。

成員內部類可以自由引用外部類的成員變量和方法;不可以定義靜態屬性或者方法;只有外部類被實例化了之後成員內部類纔可以被實例化。

局部內部類是一個代碼塊內的類,作用範圍也僅僅限於該代碼塊(類似局部變量);不能被public, protected, private 和static修飾。只能訪問方法中的final類型的局部變量。如果局部內部類位於外部類的靜態方法或者一個靜態代碼段中,那麼就稱爲局部靜態內部類,如果是普通的方法中或者非靜態代碼段中就稱爲是局部內部類。

匿名內部類是沒喲名稱的內部類,不使用extends class implements。沒有構造函數,通過集成其他類或者實現接口(大多使用的是這種,尤其是AndroidUI開發中)。必須跟在new的後面,匿名內部類也屬於是局部內部類。

Java中的this和super

Java中this 用來指向當前實例對象,重要的一個功能就是區分成員變量與方法形參(比如當構造方法的形參和成員變量同名的時候就需要this幫忙了)

super可以用來訪問父類的方法和成員變量(比如子類的方法或者成員變量覆蓋了父類的同名方法和成員變量的時候,如果在子類中需要訪問父類中被覆蓋掉的同名方法或者成員變量,就需要使用super)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章