008 面向对象一
2016-01-23
1、面向過程-----> 面向對象
面向過程:面向的是完成這件事兒的過程,強調的是完成這件事兒的動作。
把大象塞進冰箱里
1、打開冰箱門
2、把大象塞進去,親下大象的屁股
3、關閉冰箱門
如果我們用面向過程的思想來解決這件事兒,當執行這件事的人的不同的時候,
我們需要為每個不同的人量身定做解決事情的方法。
我們在代碼中描述一個對象,通過描述這個對象的屬性和方法
對象必須是看得見摸得著的
燈:屬性和方法
屬性:
外形:長的
亮度:500W
顏色:白色
牌子:XX
方法:發光
電風扇:屬性、方法
外形:三個扇葉
顏色:白色
品牌:XX
方法:轉動,扇風
我們把這些具有相同屬性和相同方法的對象進行進一步的封裝,抽象出來 類這個概念。
類就是個模子,確定了對象應該具有的屬性和方法。
對象是根據類創建出來的。
類就是一個蓋大樓的圖紙?? 對象 就是蓋出來的大樓。
2、類
語法:
[public] class 類名
{
?? ?字段;
?? ?屬性;
?? ?方法;
}
寫好了一個類之后,我們需要創建這個類的對象,
那么,我們管創建這個類的對象過程稱之為類的實例化。
使用關鍵字 new.
this:表示當前這個類的對象。
類是不占內存的,而對象是占內存的。
3、屬性
屬性的作用就是保護字段、對字段的賦值和取值進行限定。
屬性的本質就是兩個方法,一個叫get()一個叫set()。
既有get()也有set()我們誠之為可讀可寫屬性。
只有get()沒有set()我們稱之為只讀屬性
沒有get()只有set()我們稱之為只寫屬性
Field字段
Method方法
Property屬性
****字段就是女人? 屬性才是男人。
4、訪問修飾符
public:公開的公共的,在哪都能訪問。
private:私有的,只能在當前類的內部進行訪問,出了這個類就訪問不到了。
5、
當我們創建好一個類的對象后,需要給這個對象的每個屬性去賦值。
我們管這個過程稱之為對象的初始化。
6、靜態和非靜態的區別
1)、在非靜態類中,既可以有實例成員,也可以有靜態成員。
2)、在調用實例成員的時候,需要使用對象名.實例成員;
??? 在調用靜態成員的時候,需要使用類名.靜態成員名;
總結:靜態成員必須使用類名去調用,而實例成員使用對象名調用。
?? ?? 靜態函數中,只能訪問靜態成員,不允許訪問實例成員。
????? 實例函數中,既可以使用靜態成員,也可以使用實例成員。
????? 靜態類中只允許有靜態成員,不允許出現實例成員。
使用:
1)、如果你想要你的類當做一個"工具類"去使用,這個時候可以考慮將類寫成靜態的。
2)、靜態類在整個項目中資源共享。
只有在程序全部結束之后,靜態類才會釋放資源。
堆? 棧? 靜態存儲區域
釋放資源。GC Garbage Collection垃圾回收器
7、構造函數
作用:幫助我們初始化對象(給對象的每個屬性依次的賦值)
構造函數是一個特殊的方法:
1)、構造函數沒有返回值,連void也不能寫。
2)、構造函數的名稱必須跟類名一樣。
創建對象的時候會執行構造函數
構造函數是可以有重載的。
***
類當中會有一個默認的無參數的構造函數,當你寫一個新的構造函數之后,不管是有參數的還是
無參數的,那個默認的無參數的構造函數都被干掉了。
8、new關鍵字
Person zsPerson=new Person();
new幫助我們做了3件事兒:
1)、在內存中開辟一塊空間
2)、在開辟的空間中創建對象
3)、調用對象的構造函數進行初始化對象
9、this關鍵字
1)、代表當前類的對象
2)、在類當中顯示的調用本類的構造函數? :this
10、命名空間
可以認為類是屬于命名空間的。
如果在當前項目中沒有這個類的命名空間,需要我們手動的導入這個類所在的
命名空間。
1)、用鼠標去點
2)、alt+shift+F10
3)、記住命名空間,手動的去引用
11、在一個項目中引用另一個項目的類
1)、添加引用
2)、引用命名空間
12、值類型和引用類型
區別:
1、值類型和引用類型在內存上存儲的地方不一樣。
2、在傳遞值類型和傳遞引用類型的時候,傳遞的方式不一樣。
值類型我們稱之為值傳遞,引用類型我們稱之為引用傳遞。
我們學的值類型和引用類型:
值類型:int、double、bool、char、decimal、struct、enum
引用類型:string、自定義類、數組
存儲:
值類型的值是存儲在內存的棧當中。
引用類型的值是存儲在內存的堆中。
13、字符串
1)、字符串的不可變性
當你給一個字符串重新賦值之后,老值并沒有銷毀,而是重新開辟一塊空間存儲新值。
當程序結束后,GC掃描整個內存,如果發現有的空間沒有被指向,則立即把它銷毀。
2)、我們可以講字符串看做是char類型的一個只讀數組。
ToCharArray();將字符串轉換為char數組
new string(char[] chs):能夠將char數組轉換為字符串
14、字符串提供的各種方法
1)、Length:獲得當前字符串中字符的個數
2)、ToUpper():將字符轉換成大寫形式
3)、ToLower():將字符串轉換成小寫形式
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比較兩個字符串,可以忽略大小寫
5)、Split():分割字符串,返回字符串類型的數組。
6)、Substring():解決字符串。在截取的時候包含要截取的那個位置。
7)、IndexOf():判斷某個字符串在字符串中第一次出現的位置,如果沒有返回-1、值類型和引用類型在內存上存儲的地方不一樣。
8)、LastIndexOf():判斷某個字符串在字符串中最后一次出現的位置,如果沒有同樣返回-1
9)、StartsWith():判斷以....開始
10)、EndsWith():判斷以...結束
11)、Replace():將字符串中某個字符串替換成一個新的字符串
12)、Contains():判斷某個字符串是否包含指定的字符串
13)、Trim():去掉字符串中前后的空格
14)、TrimEnd():去掉字符串中結尾的空格
15)、TrimStart():去掉字符串中前面的空格
16)、string.IsNullOrEmpty():判斷一個字符串是否為空或者為null
17)、string.Join():將數組按照指定的字符串連接,返回一個字符串。
15、繼承
我們可能會在一些類中,寫一些重復的成員,我們可以將這些重復的成員,
單獨的封裝到一個類中,作為這些類的父類。
Student、Teacher、Driver? 子類? 派生類
Person? ??? ??? ??? ??? ?? 父類? 基類
子類繼承了父類,那么子類從父類那里繼承過來了什么?
首先,子類繼承了父類的屬性和方法,但是子類并沒有繼承父類的私有字段。
問題:子類有沒有繼承父類的構造函數?
答:子類并沒有繼承父類的構造函數,但是。子類會默認的調用父類無參數的構造函數,
創建父類對象,讓子類可以使用父類中的成員。
所以,如果在父類中重新寫了一個有參數的構造函數之后,那個無參數的就被干掉了,
子類就調用不到了,所以子類會報錯。
解決辦法:
1)、在父類中重新寫一個無參數的構造函數。
2)、在子類中顯示的調用父類的構造函數,使用關鍵字:base()
16、繼承的特性
1、繼承的單根性:一個子類只能有一個父類。
2、繼承的傳遞性
17、查看類圖
18、object是所有類的基類。
19、new關鍵字
1)、創建對象
2)、隱藏從父類那里繼承過來的同名成員。
隱藏的后果就是子類調用不到父類的成員。
?
轉載于:https://www.cnblogs.com/wsxiao/p/5153208.html
總結
- 上一篇: golang为LigerUI编写简易版本
- 下一篇: 【IOS学习基础】OC类的相关