1. 程式人生 > >2017-06-26

2017-06-26

2個 構造函數 int city 實現類 得到 null 當我 類繼承

面向對象三大特征:

封裝 繼承 多態

封裝:方便多次調用;簡化用戶操作

為什麽要使用繼承:

1.相同代碼出現兩次:冗余代碼!!!
2.設計類的時候會發現,很多類中具有相同的成員,為了減少代碼的冗余,我們將這些相同的成員提取出來,單獨的封裝成了一個類,作為其他類的父類,或者叫基類.其他類這叫做這個類的子類,或者派生類.

繼承的缺點: 打破類的封裝性!

C#中所有的類都直接(無冒號:)或者間接(有冒號:)的繼承於 Object類.

一個子類繼承了一個父類,那麽子類繼承了父類的如下成員(能.出來的):
1.屬性
2.函數(不含構造函數)

字段(private)雖然"繼承"了,但是.不出來,因為它是父類這個類的,而不是父類某個對象的.

難點: 子類是否繼承了父類的構造函數!!!!!
1.子類並沒有繼承父類的構造函數,因為在創建子類對象的時候,調用不到父類的構造函數.
2.但是,在創建子類對象的時候,會先執行父類的構造函數,也就是說,子類並沒有繼承父類的構造函數,但是會先調用父那個無參數的構造函數.因為父類有可能在自己默認的無參數的構造函數中對成員進行初始化,如果子類想要得到父類初始化後的成員,子類就要去調用父類默認的無參數的構造函數.
3.子類用有參數的構造函數創建對象的時候,也會先去調用父類默認的無參數的構造函數.

當我們在父類中重新寫了一個有參數的構造函數後,默認的無參數的構造函數就不存在了.
解決方法:1.在父類中重新寫一個無參數的構造函數;---這個方法基本不用.
2.在子類中顯示的調用父類有參數的構造函數,使用關鍵字 :base

父類:public Person(string name,int age,char gender){...;}
子類:public Student(string name int age,char gender,int id):base(name,age,gender)
{ ... ;this Id = id;}

如果不寫 :base(name,age,gender),子類用有參數的構造函數創建對象的時候,依然會先調用父類無參數的構造函數,如果父類沒有顯示的寫出無參數的構造函數,會報錯!
如果父類沒有無參數的構造函數,子類也不能有,會報錯!

this:代表當前類的對象,可以顯示的調用本類的構造函數;
base:一個指向父類的引用,通過base可以調用父類的成員,不代表父類的對象.
new:1.隱藏父類的成員
2.創建對象

靜態成員的好處:資源共享;
壞處:占內存,能不寫盡量不寫.

方法表 :類的方法的存放空間,裏面有一塊區域叫 靜態存儲區域,專門存放 類的 所有靜態成員


繼承的特性:
1.單根性:只有一個爹,幹爹都不算(類是親爹,object 接頭都是幹爹)
2.傳遞性:繼承的成員可以一層一層往下傳遞.

訪問修飾符(訪問的權限):

1.private 私有的,只能在當前類的內部訪問
2.public 公開的,在哪都可以訪問
3.internal 只能在當前項目的內部訪問,出了這個項目就訪問不到了(項目可以理解為命名空間),類默認就是internal
4.protected 只能在當前類的內部,以及該類的子類中訪問
5.protected internal

父類的訪問權限不能比子類的訪問權限低:
因為如果父類低於子類的話,父類的成員會暴露,別的項目可以通過子類訪問父類的成員.


類 : internal < public 默認 internal
成員: 當前項目中 internal 的權限比protected大
但是跨項目,protected 比 internal 大,因為跨項目後,可以通過繼承該類,然後訪問 protected 修飾的成員.(不理解!!!)

跨項目訪問:
1.添加要訪問的項目的引用:
2.導入要使用的類所在的命名空間; using ***;


裏氏替換原則:
1.子類可以復制給父類
2.如果父類中裝的是子類對象,那麽可以將這個父類轉換為"對應"的子類對象,這樣就可以調用子類的成員了.

Person p = new Person();
p. 這裏是無法調用子類的成員;

Person p = new Student();
p. 這裏也無法調用子類的成員;

Person p = new Student();
((Student)p). 這裏就可以調用子類的成員;


我們使用兩個關鍵字幫助我們實現類型轉換:is as

is:判斷是否能轉換,返回值是 bool 類型,但是實際並沒有轉換

Person p = new Student();

if (p is Student){...}


as:進行類型轉換,如果成功,返回對應的對象,如果失敗則返回null

Person p = new Student();

Student s = p as Student;//


額外: string ss = string.Join("||", "213", true, 342,‘男‘); //結果為: 213||true||342||男
for+TAB(快捷方式)

開放封閉原則: 對程序的擴展開放,對代碼的修改保持封閉


集合:

1.非泛型集合 : 長度不固定,類型不固定(對應數組:長度固定,類型固定)

ArrayList list = new ArrayList();
//list.Add(Object value)
list.Add("123");
list.Add(3123);
list.Add(true);
list.Add(new Person());
//list.Add(new int[] { 1,23,4,3,5,6,6,5}); 這樣寫,顯示不出來具體的數字,需要用 is或者 as 強制轉換
list.AddRange(new int[] { 1,2,3,4,5,6});
//list.Add(list);這樣寫,顯示不出來具體的數字;
list.AddRange(list);

===>給集合添加單個元素用Add,添加數組和集合用AddRange


list.Clear():清空所有的數據
list.Remove(Object obj):寫誰刪誰(如果有重復的,刪第一個)(和 for一起用的時候,容易出錯喔!!刪了下標就變了喔!)
list.RemoveAt(int index):下標是誰就刪誰,沒有這個下標就拋異常
list.RemoveRange(0, 2);從下標0的元素開始刪,刪2個.
list.Contains(Object obj);返回bool類型
list.Insert(1,"aaaa"); 在 下標1的位置插入aaaa;
list.InsertRange(1,new string[]{"aaa","bbb"}); 在 下標1的位置插入數組或者集合;
list.Reverse() 順序反轉
list.Reverse(int index,int count) 制定範圍的元素順序反轉
list.Sort(); 升序排序,類型不一樣報異常

list.Count 是指集合中實際包含的元素的個數.(註意和數組區分) int 類型
list.Capcity:集合中可以包含的元素的個數 int 類型
count變少,多的空間也銷毀掉,但始終比count多

2.泛型集合

2017-06-26