你們好,我叫李京陽,,很高興認識你們,之因此我想開一個本身的博客,就是來把本身所瞭解的知識點經過本身的話寫一下,但願被博客園的朋友們點評和一塊兒討論一下,也但願從博客園中多認識一些軟件開發人員!如今我開始講一下面向對象的一點知識,請大家多多點評和討論!! 程序員
1. 結構體不能繼承,可是能夠實現接口.
可是全部的結構體都默認從ValueType這個類繼承.
而ValueType這個類從Object類繼承.
根據繼承的傳遞性 因此咱們的結構體對象中就擁有object類的成員.
能夠從反編譯工具去查看,個人反編譯工具過時了,沒截圖
2. 被sealed修飾的類,叫作密封類.
密封類不能做爲父類. 可是能夠做爲子類.
能夠從反編譯工具去查看,個人反編譯工具過時了,沒截圖
3. 子類的訪問級別不能比父類高函數
類: public--> internal
成員: public--> internal--> protected--> private
4. 靜態類是不能被繼承的.
a. 靜態類不能相互繼承 由於靜態類沒有實例構造函數
b. 靜態類直接從object類繼承.
c. 靜態類的本質實際上是1個密封類.
5. this和base(進入繼承那個博客說的挺詳細的,能夠進入那裏看看)
a. this關鍵字
1) 表明當前對象
在實例方法中使用this關鍵字就表明當前對象
經過this關鍵字能夠點出本類的全部的成員和父類的非私有成員
2) 調用本類的其餘的構造函數
在構造函數的後面 的 this 表明調用本類的其餘的構造函數
b. base關鍵字
1) 在實例方法中 經過base關鍵字能夠顯示的訪問子類對象中的非私有的父類成員.
2) 調用父類的構造函數
在子類的構造函數的後面的 base 表明調用父類的構造函數.
6. 在子類中能夠存在和父類中的同名方法,若是方法的參數的個數或者類型不一樣
那麼他們子類中構成重載.
7. 在子類對象中是能夠存在和父類相同的成員.
建立父類對象,經過父類對象調用這個同名成員 毫無疑問調用的是父類的.
建立子類對象,經過子類對象調用這個同名成員 調用的是子類本身獨有的.
子類中的同名成員會將父類的同名覆蓋掉.因此咱們經過子類對象來調用這個同名成員的時候
調用的是子類的同名成員.
請記住,經過子類對象是不管如何也調用不到同名的父類成員,由於子類的同名成員將父類的同名成員覆蓋掉.
可是在子類的內部,仍然是能夠經過base關鍵字調用到父類的同名成員.
8. 默認狀況下,子類中的同名成員在隱藏父類的同名成員的時候.
編譯器會提示程序員.
若是咱們不想被編譯器提示 咱們確實是要去隱藏父類的同名成員 這個時候就加上new關鍵字.
告訴編譯器 我是有意而爲之 不要多嘴.
new關鍵字加與不加 都會將父類的同名成員隱藏掉.
9. new關鍵字有什麼做用啊?
a. 建立對象
b. 隱藏父類的同名成員
c. 限制泛型的類型.
10. 里氏替換原則(LSP)
a. 子類能夠替換父類的位置,而且程序的功能不受1丁點影響.
爲何?
1). 由於父類擁有的功能,子類都擁有,子類只會多功能而不會少功能.
2). 要1個父類對象. 可是咱們卻給了1個子類對象 這是說得通的.
由於子類是1個父類.
3). 是知足自動類型轉換的:
父類和子類是相互兼容的. 父類的範圍是比子類的範圍要大的.
b. 里氏替換原則的具體表現形式:
當1個父類變量指向1個子類對象的時候. 這個時候就有咱們的里氏替換原則了.
c. 里氏替換原則的好處在那?
a. 最大的好處是爲了多態.
b. 1個父類變量不只僅能夠指向父類對象,還能夠指向它的子類對象.
d. 在替換的時候,只能是子類替換父類.
沒有繼承關係的絕對不能替換的.
父類也不能去替換子類的位置.
e. 當1個父類變量指向1個子類對象的時候.
經過這個父類變量只能調用到這個子類對象中的父類成員.
子類獨有的成員 經過這個父類變量是沒法調用的.
哪怕子類和父類中存在同名成員,經過這個父類變量調用這個同名成員仍然調用的是父類的.
11. 在建立對象的時候,這個對象的大小:
本類和父類的全部的字段 再加上1個同步索引快和1個類型指針.
12. 里氏替換原則最爽的地方
1個父類類型的變量中 能夠存儲1個父類對象的引用和子類對象的引用
不爽的地方在於,取出來之後 類型是1個父類類型的 經過這個父類類型只能訪問到子類中的父類成員.
好處: 存的時候很爽.
壞處: 取出來的時候,類型是1個父類類型. 沒法調用到子類獨有的成員 。
13. 類型轉換
a. 沒有辦法直接的將1個父類類型的變量的值 賦值給1個 子類變量.
b. 若是必定要賦值的話,那麼咱們使用強制轉換的語法就能夠了.
c. 類型轉換的意義:
強制的把父類變量中的值(對象的地址) 賦值給 子類變量.
d. 轉換成功的條件:
若是子類變量可以指向父類變量指向的對象.那麼就能夠轉換成功.
變量可以指向那些對象?
變量能夠指向本類的對象和本類的子類對象.
e. 類型轉換隻適合於有繼承關係的 不然就會報語法錯誤.
14. 類型判斷
is關鍵字能夠判斷某個變量的類型.
a. 某個變量必定是這個變量的類型
Person p; p變量必定是1個Person類型.
b. 若是變量指向1個子類對象, 那麼這個變量也是這個子類類型.
Person p = new Studnet();
p必定是1個Person類型.
p也是1個Student類型的.
c. 若是1個父類變量指向1個子類對象,那麼這個父類變量的類型.
便是父類的類型. 也是指向的子類對象的類型 也是指向的子類對象的父類類型.
Person p = new ItCastStu();
p是1個Person類型.
p是ItCastStu
p是Student類型.
d. 子類必定是1個父類類型.
當父類變量指向1個子類對象的時候,這個父類變量也是這個子類類型.
eg: p is Student
p變量的類型自己就是Student
p變量指向1個Student對象.
p變量指向1個Student子類對象,.
經過is關鍵字來判斷1個引用類型的變量是否指向1個指定的對象.
is關鍵字只適合用於判斷擁有繼承關係的類型.
15. 在作轉換的時候,若是要保證不會發生異常,咱們在轉換以前最好是作1個類型判斷.
as 轉換, 與強制轉換的效果是同樣的.
as轉換在轉換失敗的時候,不報異常,返回null
強制轉換若是轉換失敗 會報異常工具