1、面向對象的概念
1.面向過程(C)-----》面向對象
面向過程:面向的是完成這件事的過程,強調的是完成這件事的動做。
如:將東西放進冰箱
一、打開冰箱門
二、把東西放進去
三、關閉冰箱門
如上都是強調的動做ide
如:張三長的矮小,力氣也小
打開冰箱門,因爲矮小夠不這,須要墊個凳子
力氣小擡不動東西,須要找人幫忙
關閉冰箱門,依然須要墊個凳子函數
李四長的高,力氣很是大 本身就能打開冰箱門 本身就能擡動 關閉冰箱門也不須要凳子
若是用面向過程的思想來解決事,當執行這件事的人不一樣時,這樣就須要爲每一個不一樣的人量身定作解決事情的方法。工具
面向對象:沒有統一的理解,找個對象來作這個事情
如:把東西放進冰箱裏
由於乾的事情裏,每件都有冰箱,這樣就能夠以冰箱做爲對象
1.冰箱門能夠被打開
2.東西能放進冰箱裏
3.冰箱門能夠被關閉this
張三:調用1 調用2 調用3
李四:調用2 調用2 調用3code
面向對象:意在寫出一個通用的代碼,屏蔽差別對象
關門
面向過程:關門
張三:一腳把門踹緊了
李四:輕輕的把門帶上了
王五:門沒關嚴內存
面向對象:關門
門能夠被關閉資源
我在黑板上畫了一個圓、方塊、菱形
將 圓做爲對象 圓能夠被畫在黑板上
將 方塊做爲對象 方塊能夠被畫在黑板上
將 菱形做爲對象 菱形能夠被畫在黑板上get
將 黑板做爲對象 黑板上能夠被畫:圓、方塊、菱形
找對象時,通常找的是被動的一方string
咱們在代碼中描述一個對象,經過描述這個對象的屬性和方法。
對象沒必要須是看得見摸得着的
燈:屬性和方法
屬性:值
外形:長的
亮度:500W
顏色:白色
牌子:XX
發信:發光
電風扇:屬性,方法
屬性:三個扇葉
顏色:白色
品牌:XX
方法:轉動,扇風
咱們把具備相同屬性和相同方法的對象進行進一步的封裝,抽象出來,類這個概念。
類就是個模子,肯定對象應該具備的屬性和方法
對象時根據類建立出來的。
類至關於一個蓋大樓的圖紙,對象就是蓋出來的大樓
2、面向對象的代碼
類:
語法
public class 類名
{
字段:
屬性:
方法:
}
寫好類以後,咱們須要建立這個類的對象,
name,建立這個類的對象的過程稱之爲:實例化
使用關鍵字:new
this:表示當前這個類的對象
類是不佔內存的,而對象時佔內存的
public class Person { public string _name; public int _age; public char _gender; public void CHLSS() { Console.WriteLine("我叫{0},我今年{1}歲,我是{2}的,我能夠吃喝拉撒睡~~~", this._name,this._age,this._gender); } }
調用類
static void Main(string[] args) { //建立person類的對象 Person zhangSan = new Person(); zhangSan._name = "張三"; zhangSan._age = 21; zhangSan._gender = '男'; zhangSan.CHLSS(); Console.ReadKey(); }
屬性:保護字段,對字段的賦值進行賦值和取值進行限定
屬性的本質就是兩個方法,get()和set()
當給屬性賦值的時候,首先執行set方法
當輸出屬性值得時候,會執行get方法
字段就是女人 屬性纔是真男人
字段在類中,必須是私有的。要對字段進行操做必須經過屬性。
屬性的代碼
既有get又有set:可讀可寫屬性
只有get:只讀屬性
只有set:只寫屬性
訪問修飾符
public:公開的公共的,在哪都能訪問
pribate:私有的,只能在當前類的內部進行訪問,出了這個類就訪問不到
public class Person { private string _name; public string Name { //當輸出屬性值得時候,會執行get方法 get { return _name; } //當給屬性賦值的時候,首先執行set方法 set { _name = value; } } private int _age; public int Age { get { return _age; } set { if (value < 0 || value > 100) { value = 0; } _age = value; } } private char _gender; public char Gender { get { if (_gender != '男' && _gender != '女') { return _gender = '男'; } return _gender; } set { _gender = value; } } public void CHLSS() { Console.WriteLine("我叫{0},我今年{1}歲,我是{2}的,我能夠吃喝拉撒睡~~~", this.Name,this.Age,this.Gender); } }
屬性調用
class Program { static void Main(string[] args) { //建立person類的對象 Person zhangSan = new Person(); zhangSan.Name = "張三"; zhangSan.Age = 21; zhangSan.Gender = '男'; zhangSan.CHLSS(); Console.ReadKey(); } }
3、靜態和非靜態的區別(static)
一、在非靜態類中,既能夠有實例成員,也能夠有靜態成員。
二、在調用實例成員的時候,須要使用對象名.實例成員
在調用靜態成員的時候,須要使用類名.靜態成員
總結:靜態成員必須使用類名去調用,而實例成員使用對象名調用
靜態函數中,只能訪問靜態成員,不容許訪問實例成員
實例函數中,既可使用靜態成員,也可使用實例成員
靜態類中只容許有靜態成員,不能有實例成員
使用範圍
一、若是你想要你的類當作一個「工具類」去使用,這時候能夠考慮寫成靜態類。(常用的類)
二、靜態類在整個項目中資源共享
只有在程序所有結束後,靜態類纔會釋放資源
釋放資源:釋放內存 C#中有垃圾回收器GC
4、構造函數
做用:幫助咱們初始化對象(給對象的每一個屬性依次的賦值)
構造函數是一個特殊的方法
一、構造函數沒有返回值,連void也不能寫
二、構造函數名必須跟類名同樣
三、構造函數必須是public
建立對象的時候會執行構造函數
構造函數能夠有重載
類當中會有一個默認的無參數的構造函數,當你寫一個新的構造函數以後,不論是不是無參數的,那個默認的五參數的構造函數都會被幹掉
關鍵字:new
new幫助咱們作了三件事
一、在內存中開闢一塊空間
二、在開闢的空間中建立對象
三、調用對象的構造函數進行初始化對象
關鍵字:this
一、表明當前類的對象
二、在類當中顯示的調用本類的構造函數
5、析構函數
當程序結束的時候,析構函數纔會執行
做用:幫助咱們釋放資源
GC有時候不會立刻釋放資源,這時候使用析構函數來立刻釋放資源。
最後的總結練習
class Ticket { /*寫一個Ticket類,有一個舉例屬性(本屬性只讀,在構造方法中賦值,不能爲負數) 有一個價格屬性,價格屬性只讀,而且根據舉例distance計算價格Price(1元/千米) 0-100千米 不打折 101-200千米 打9.5折 201-300千米 打9折 300千米以上 打8折 有一個方法,能夠顯示這張票的信息,90千米90塊錢 */ private double _distance; public double Distance { get { return _distance; } } public Ticket(double distance) { if (_distance < 0) { _distance = 0; } this._distance = distance; } private double _price; public double Price { get { if (_distance > 0 && _distance <= 100) { return _distance * 1.0; } else if (_distance > 100 && _distance <= 200) { return _distance * 0.95; } else if (_distance > 200 && _distance <= 300) { return _distance * 0.9; } else { return _distance * 0.8; } } } public void Show() { Console.WriteLine("{0}千米{1}元錢", _distance, Price); } } 調用 static void Main(string[] args) { Ticket t = new Ticket(150); t.Show(); Console.ReadKey(); } }