1.里氏替換原則
1.里氏替換原則:在一個軟件系統中,如果子類出現在父類出現的位置,而整個軟件功能又沒有影響,那么咱們稱為里氏替換。
2.
考試題:父類變量指向子類對象!!
3.里氏替換 是 設計原則的一種
七種設計原則 ,寫成blogs。
4.Is 和as
Is 做類型判定, 要想進行父類對象 到子類 類型的轉換,還得用 as
2.目前學過的兩種多態
第一種:虛方法實現多態
第二種:抽象方法實現多態
實現面向對象的多態性有哪幾種方法?
總共有3種,第一種,虛方法實現多態, 第二種:抽象方法實現多態 第三種:接口實現多態
抽象類可以被繼承嗎?
可以,不僅可以被普通類繼承,也可以被抽象類繼承
3,抽象方法可以有方法體嗎?
不可以,連花括號都不能有
3.抽象類和抽象方法
1.定義一個抽象類,用abstract 修飾
2.抽象方法不能有方法體,甚至連{}都不能有
3.抽象方法只能存在於抽象類中,但是抽象類中可以有非抽象方法
4.抽象類不能實例化
5.抽象類中抽象方法只是用來規定方法的形式(參數,返回值),約束子類方法的形式
6.抽象類中的抽象成員必須在子類中全部實現,除非子類也是抽象類
7.子類實現抽象方法的快捷鍵,Ctrl+.(沒有輸入法情況下 )
6.用虛方法實現多態的步驟
子類重寫父類的虛方法
兩種方式
創建父類變量,實例化子類對象
把父類類型作為參數類型,該子類及子類對象作為參數傳入
運行時,根據實際創建的對象決定執行哪個方法
7.什么是抽象類?
專業人士解析;如果在一個類前加上了abstract關鍵字,那么該類就稱為抽象類
8.快速在子類中生成所有的抽象方法
方式一:在有輸入法的情況下,使用Alt+Shift+F10
方式二;在無任何輸入法的情況下,使用Ctrl+.
注意事項:01.必須無輸入法狀態
02.不能點擊小鍵盤的點
9.如果一個類用sealed關鍵字修飾,那么該類就是密封類
特性:密封類不能被繼承
10.如果以類用static修飾,那么該類就是靜態類,在靜態類中所有成員(成員變量和成員方法)都必須是靜態的額
public static class SqlHelper
{
public static string name;
public static void Say()
{
}
}
注意點:
01.在靜態方法中不能直接訪問非靜態的方法或者變量
如果要在靜態方法中,訪問非靜態成員,那么要通過對象名.方法名訪問。
11.面向接口編程
。。。
接口是一種比抽象類更加抽象的"類"
(這里為什么會用類,但是加了引用,是因為接口本身不直接是類,在底層編譯時會由JVM轉換成抽象類)
但是要明確:接口本身就不是類.
接口是用來定義類和之間的協議,它所提供的是一種形式而沒有具體實現.
(接口中在jdk8之前是沒有方法體的jdk8可以使用default關鍵字修飾方法)
同時如果有類實現了接口那么必須實現接口中沒有實現方法.實現通過關鍵字implements
interface. --外貌他的實現類代表如何工作.
4.抽象方法和虛方法的區別
虛方法:
1、virtual方法表示此方法可以被重寫, 也就是說這個方法具有多態.父類中的方法是通用方法,可以在子類中重寫以重新規定方法邏輯.
2、virtual方法可以直接使用,和普通方法一樣
3、不是必須重寫的. 子類可以使用base.方法 的方式調用, 無論有沒有在子類使用override(重寫關鍵字)去重寫
virtual關鍵字只是明確標示此方法可以被重寫, 其實它和一般的方法沒有什么區別
相應的
sealed關鍵字標示此方法不可以被重寫,因為是密封類
虛方法和抽象方法的區別:
1.虛方法可以有實現體,抽象方法不能有實現體。
2.抽象方法
要求派生類必須重載這個方法;
3.抽象方法必須放在抽象類中聲明;
虛方法
告訴編譯器,這個方法可以重寫。
當基類的方法與派生類的方法重名時,
可以選擇派生類的方法從基類繼承並重寫,
還是,把基類的方法隱藏起來(使用.base)。
虛方法與抽象方法的使用(當多個子類繼承同一個基類時):
若基類的中的方法在子類中實現同樣的功能則使用虛方法,只要在基類中寫一個虛方法的實現就可以了,然后在子類中調用,方便操作;
若子類調用基類的方法實現不同的功能的時候則用抽象類,因為抽象類的方法的實現必須在子類中實現,在子類中寫實現就可控度更高。
5. 面向對象的四大特性
封裝:保證對象自身數據的完整性和安全性。
繼承:建立類之間的關系。
多態:相同的方法調用可實現不同的實現方式。
抽象:
抽象是人們認識事物的常用方法,比如地圖的繪制。抽象的過程就是如何簡化、概括所觀察到的現實世界,並為人們所用的過程。
抽象是軟件開發的基礎。軟件開發離不開現實環境,但需要對信息細節進行提煉、抽象,找到事物的本質和重要屬性。
抽象包括兩個方面:過程抽象和數據抽象。過程抽象把一個系統按功能划分成若干個子系統,進行"自頂向下逐步求精"的程序設計。數據抽象以數據為中心,把數據類型和施加在該類型對象上的操作作為一個整體(對象)來進行描述,形成抽象數據類型ADT。
所有編程語言的最終目的都是提供一種"抽象"方法。一種較有爭議的說法是:解決問題的復雜程度直接取決於抽象的種類及質量。其中,"種類"是指准備對什么進行"抽象"。匯編語言是對基礎機器的少量抽象。后來的許多"命令式"語言(如FORTRAN、BASIC和C)是對匯編語言的一種抽象。與匯編語言相比,這些語言已有了較大的進步,但它們的抽象原理依然要求程序設計者着重考慮計算機的結構,而非考慮問題本身的結構。在機器模型(位於"方案空間")與實際解決的問題模型(位於"問題空間")之間,程序員必須建立起一種聯系。這個過程要求人們付出較大的精力,而且由於它脫離了編程語言本身的范圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。由此造成的副作用便是一門完善的"編程方法"學科。
為機器建模的另一個方法是為要解決的問題制作模型。對一些早期語言來說,如LISP和APL,它們的做法是"從不同的角度觀察世界"、"所有問題都歸納為列表"或"所有問題都歸納為算法"。PROLOG則將所有問題都歸納為決策鏈。對於這些語言,可以認為它們一部分是面向基於"強制"的編程,另一部分則是專為處理圖形符號設計的。每種方法都有自己特殊的用途,適合解決某一類的問題。但只要超出了它們力所能及的范圍,就會顯得非常笨拙。
面向對象的程序設計在此基礎上則跨出了一大步,程序員可利用一些工具來表達問題空間內的元素。由於這種表達非常普遍,所以不必受限於特定類型的問題。人們將問題空間中的元素以及它們在方案空間的表示物稱作"對象"。當然,還有一些在問題空間沒有對應體的其他對象。通過添加新的對象類型,程序可進行靈活的調整,以便與特定的問題配合。所以在閱讀方案的描述代碼時,會讀到對問題進行表達的話語。與以前的方法相比,這無疑是一種更加靈活、更加強大的語言抽象方法。
總之,OOP允許人們根據問題,而不是根據方案來描述問題。然而,仍有一個聯系途徑回到計算機。每個對象都類似一台小計算機;它們有自己的狀態,而且可要求它們進行特定的操作。與現實世界的"對象"或者"物體"相比,編程"對象"與它們也存在共通的地方:它們都有自己的特征和行為。