標籤:style color 使用 strong 資料 ar 代碼 new
19.什麼是類型?
用來定義某一種資料在記憶體裡開闢空間的大小,還可以預置操作此種類型資料的相關方法
20.this關鍵字在方法中使用時所代表的含義
this指的是當前類的對象,或者父類的類的對象(base只能指向父類的對象)
21.裡氏替換原則
子類替換父類所在的位置
22.C#中的資料類型
- 實值型別
- 簡單類型(數字類型(int,short,long,float,double),字元(char),邏輯值(bool)),結構體(struct),枚舉(enum)
- 參考型別
- 字串(string),數組[ ],object(所有類的基類),類 class,委託 delegate
23. 實值型別變數的初始化(記憶體配置)
1.類的成員變數
該變數是跟隨類的對象存在於堆記憶體。當對象引用斷開時,等著記憶體回收行程進行清理時便被銷毀
2.方法的局部變數
該變數是在方法被調用時,存在於棧記憶體,方法執行完畢後被銷毀
24. 繼承
1)、為什麼要有繼承?
A、提高代碼的重用性
B、實現多態
2)、繼承的局限性
A、一個類只能繼承一個父類
B、子類只能繼承父類的非私人的成員
3)、當存在繼承關係時,子類如何訪問父類的非私人成員
A、base關鍵字:存在於子類對象裡,用來指向父類對象的指標
B、this關鍵字:擷取父類的非私人的成員和本類的成員
25、子類可以強制轉換為父類,但父類不能轉換為子類
26、is和as的相同和區別?
is是判斷,傳回型別為bool
as是轉換的意思。as只能對參考型別的做轉換。as是先判斷在轉換,先測試轉換是否合法,如果合法就轉換,否則就返回NULL
相同:都不會拋出異常
27、override與重載的區別
A、重載是方法的名稱相同。參數或參數類型不同,進行多次重載以適應不同的需要
B、override是進行基類中函數的重寫。為了適應需要
28、override重寫的方法的“類型”
虛方法(vritual):必須有方法體
抽象方法(abstract):沒有方法體
29、什麼是多態?
就是用子類來執行個體化父類,調用的是父類的抽象方法/虛方法,但實際執行的是子類執行個體重寫的方法
30、抽象方法只能定義在抽象類別中
31、當存在繼承關係的時候,建立子類對象的時候不會建立父類對象,只會有一個對象。
例如:Animal a = new Cat();
當new一個子類的時候,有且只有一個子類對象
——————————————————————————————————————————————————————————————————————
而我們經常看到這種說法:new子類時,先建立子類對象,調用子類的構造方法時,建立父類的對象,調用父類建構函式最後返回來執行子類構造方法。子類預設調用父類的無參構造方法,如果父類沒有無參的構造方法,則必須顯式的調用————》這是一個很大的誤區!
在記憶體中根本就無所謂對象的概念!new的時候是根據子類和父類所有靜態成員的大小以及類型指標開闢一個總的空間(該空間不包含方法),子類和父類的類型指標指向兩個類的方法表,所以,子類對象可以訪問到父類和子類的方法。
32、如果子類和父類存在同名但沒有重寫關係的方法的時候,那麼調用時,如果調用的是父類變數調用,則調用父類方法,如果是子類變數調用,則調用子類方法。如果子類和父類存在同名且有重寫關係的方法,那麼不管變數是什麼類型,調用的都是子類的方法。
33、虛方法和抽象方法的相同點和不同點:
相同點:
都能被子類重寫且都不能為私人的
不同點:
1.abstract和virtual的關鍵字不同
2.vritual方法必須有實現,哪怕是空實現,而abstract方法必須沒有實現
3.virtual方法的子類可以重寫父類方法也可以不重寫,而抽象方法所在的類的子類必須重寫該父類的方法
4.抽象方法必須在抽象類別中聲明,而虛方法可以存在於任何一個類中
34、抽象類別存在的意義:
抽象類別存在的目的就是指定規則,而不是具體實現,是為了約束子類的行為,具體實現交給子類來完成。
35、多態的優勢:
1.代碼的內部各個層之間的關聯比較小,相互之間約束少。(低耦合)
2.方法的功能和職責單一,即一個方法只做一件事情。(高內聚)
3.實現代碼的可維護性和可擴充性,便於二次開發
4.把不同的子類對象都當著父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的程式,以便靈活的適應不斷變化的需求。
36、子類中的base關鍵字指向的是父類對象。它是子類對象本身,但他的類型是父類。
37、以下情況類不能被執行個體化:
抽象類別、靜態類、類的建構函式已被私人化
38、介面——特殊的抽象類別(約束和統一類的行為)
介面中只有方法、屬性、索引器和事件的聲明
介面只能用public和internal兩個修飾符
介面可以實現多繼承
如果一個抽象類別繼承了一個介面,那麼將繼承的方法既可以設定為抽象方法,也可以去實現方法(既可以在抽象類別的子類中去實現,也可以再抽象類別中直接實現)