在面向?qū)ο缶幊趟枷胫安昀铮蟛糠终Z言的編程思想都是面向過程哀托。
面向過程
經(jīng)典例子:
把大象塞進(jìn)冰箱里
1缺脉、打開冰箱門
2痪欲、把大象塞進(jìn)去,親下大象的屁股
3攻礼、關(guān)閉冰箱門
打開----> 塞---->關(guān)閉
面向過程:面向的是完成這件事兒的過程业踢,強調(diào)的是完成這件事兒的動作。
小明 瘦小 矮 小屌絲
小明踩著小板凳打開冰箱門
小明找翟盼盼幫忙把大象塞進(jìn)冰箱里,孫全踩著板凳去親。
小明踩著板凳關(guān)閉冰箱門
小剛 190cm 非常大力氣
1、小剛自己就能打開冰箱門
2、小剛自己將大象塞進(jìn)冰箱里剧浸,翟可以自己親一下。
3、小剛自己關(guān)閉冰箱門
如果我們用面向過程的思想來解決這件事兒驰弄,當(dāng)執(zhí)行這件事的人的不同的時候,
我們需要為每個不同的人量身定做解決事情的方法绣的。
面向?qū)ο?/p>
面向?qū)ο螅赫覀€對象幫你做事兒叠赐。
把大象塞進(jìn)冰箱里
我們把冰箱作為對象:
1欲账、冰箱門可以被打開
2、大象可以被塞進(jìn)冰箱里
3芭概、冰箱門可以被關(guān)閉
面向?qū)ο螅阂庠趯懗鲆粋€通用的代碼赛不,屏蔽差異。
以關(guān)門為例
關(guān)門
面向過程:關(guān)門
張三 一腳把門踹緊了
李四 輕輕的把門帶上了
王五 門沒關(guān)嚴(yán)罢洲,留了個尾巴
面向?qū)ο螅宏P(guān)門
門可以被關(guān)閉
對象的描述
我們在代碼中描述一個對象踢故,通過描述這個對象的屬性和方法。
對象必須是看得見摸得著的惹苗。
燈:屬性和方法
屬性:
外形:長的
亮度:500W
顏色:白色
牌子:XX
方法:發(fā)光
類
我們把具有相同屬性和相同方法的對象進(jìn)行進(jìn)一步的封裝殿较,抽象出來 類這個概念。
類就是個模子桩蓉,確定了對象應(yīng)該具有的屬性和方法淋纲。
對象是根據(jù)類創(chuàng)建出來的。
- 1院究、語法:
[public] class 類名
{
字段;
屬性;
方法;
}
寫好了一個類之后洽瞬,我們需要創(chuàng)建這個類的對象,
那么业汰,我們管創(chuàng)建這個類的對象過程稱之為類的實例化伙窃。
使用關(guān)鍵字 new.
this:表示當(dāng)前這個類的對象。
類是不占內(nèi)存的样漆,而對象是占內(nèi)存的为障。
- 2、添加類的方法
以上兩種方法任意一種就好
*3氛濒、 代碼說明
創(chuàng)建一個Person類
namespace _01面向?qū)ο?{
public class Person
{
//字段名加下劃線
public string _name;
public int _age;
public char _gender;
//非靜態(tài)方法
public void CHLSS()
{
Console.WriteLine("我叫{0} 性別{1} 今年{2} 可以吃喝拉撒喲",this._name, this._gender, this._age);
}
}
}
在Main()函數(shù)里調(diào)用
class Program
{
static void Main(string[] args)
{
//創(chuàng)建Person類的對象
Person xiaoMing = new Person();
xiaoMing._name = "小明";
xiaoMing._age = 18;
xiaoMing._gender = '男';
xiaoMing.CHLSS();
Console.ReadKey();
}
}
輸出結(jié)果
現(xiàn)在 讓我們來修改一下Main()函數(shù)中产场,對字段的賦值,再來看下輸出結(jié)果舞竿。
class Program
{
static void Main(string[] args)
{
//創(chuàng)建Person類的對象
Person xiaoMing = new Person();
xiaoMing._name = "小明";
xiaoMing._age = -18;
xiaoMing._gender = '豬';
xiaoMing.CHLSS();
Console.ReadKey();
}
}
這結(jié)果就讓人尷尬了 京景。。骗奖。确徙。。执桌。 ┑( ̄Д  ̄)┍ 性別豬是什么鬼鄙皇??仰挣?可以看出現(xiàn)在并沒有什么可以限制字段對非法值的設(shè)定伴逸。這就需要屬性,來保護(hù)字段膘壶。
屬性
先上點解釋:
屬性的作用就是保護(hù)字段错蝴、對字段的賦值和取值進(jìn)行限定洲愤。
屬性的本質(zhì)就是兩個方法,一個叫get()一個叫set()顷锰。
既有g(shù)et()也有set()我們誠之為可讀可寫屬性柬赐。
只有g(shù)et()沒有set()我們稱之為只讀屬性
沒有g(shù)et()只有set()我們稱之為只寫屬性
改下代碼
namespace _01面向?qū)ο?{
public class Person
{
//字段名加下劃線
private string _name;
public string Name
{
//當(dāng)你輸出屬性取值的時候 會執(zhí)行g(shù)et方法
get { return _name; }
//當(dāng)你給屬性賦值的時候 首先會執(zhí)行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 != '女')
{
_gender = '男';
}
return _gender; }
set { _gender = value; }
}
//非靜態(tài)方法
public void CHLSS()
{
Console.WriteLine("我叫{0} 性別{1} 今年{2} 可以吃喝拉撒喲",this.Name, this.Gender, this.Age
);
}
}
}
1、value 就是當(dāng)前你要設(shè)定的值
2官紫、將字段用訪問修飾符 private 保護(hù)起來
private:私有的肛宋,只能在當(dāng)前類的內(nèi)部進(jìn)行訪問,出了這個類就訪問不到了束世。
3酝陈、訪問屬性 本質(zhì)上就是訪問字段
還是原來的賦值代碼,但是輸出結(jié)果已經(jīng)顯示正常了
靜態(tài)和非靜態(tài)的區(qū)別
1)良狈、在非靜態(tài)類中后添,既可以有實例成員,也可以有靜態(tài)成員薪丁。
2)遇西、在調(diào)用實例成員的時候,需要使用對象名.實例成員;
在調(diào)用靜態(tài)成員的時候严嗜,需要使用類名.靜態(tài)成員名;
namespace _01靜態(tài)和非靜態(tài)的區(qū)別
{
public class Person
{
private static string _name;
private char _gendeer;
public static string Name
{
get
{
return Person._name;
}
set
{
Person._name = value;
}
}
public char Gendeer
{
get
{
return _gendeer;
}
set
{
_gendeer = value;
}
}
//非靜態(tài)方法
public void M1()
{
Console.WriteLine("我是非靜態(tài)方法");
}
//靜態(tài)方法
public static void M2()
{
Console.WriteLine("我是靜態(tài)方法");
}
}
}
namespace _01靜態(tài)和非靜態(tài)的區(qū)別
{
class Program
{
static void Main(string[] args)
{
//調(diào)用實例成員
Person p1 = new Person();
p1.M1();//實例方法
//調(diào)用靜態(tài)成員
Person.M2();//靜態(tài)方法
Console.ReadKey();
}
}
}
總結(jié):
- 靜態(tài)成員必須使用類名去調(diào)用粱檀,而實例成員使用對象名調(diào)用。
- 靜態(tài)函數(shù)中漫玄,只能訪問靜態(tài)成員茄蚯,不允許訪問實例成員。
- 實例函數(shù)中睦优,既可以使用靜態(tài)成員渗常,也可以使用實例成員。
- 靜態(tài)類中只允許有靜態(tài)成員汗盘,不允許出現(xiàn)實例成員皱碘。
使用:
1)、如果你想要你的類當(dāng)做一個"工具類"去使用隐孽,這個時候可以考慮將類寫成靜態(tài)的癌椿。
2)、靜態(tài)類在整個項目中資源共享菱阵。只有在程序全部結(jié)束之后踢俄,靜態(tài)類才會釋放資源。
構(gòu)造函數(shù)
作用:幫助我們初始化對象(給對象的每個屬性依次的賦值)
構(gòu)造函數(shù)是一個特殊的方法:
1)晴及、構(gòu)造函數(shù)沒有返回值都办,連void也不能寫。
2)、構(gòu)造函數(shù)的名稱必須跟類名一樣脆丁。
類當(dāng)中會有一個默認(rèn)的無參數(shù)的構(gòu)造函數(shù)世舰,當(dāng)你寫一個新的構(gòu)造函數(shù)之后,不管是有參數(shù)的還是無參數(shù)的槽卫,那個默認(rèn)的無參數(shù)的構(gòu)造函數(shù)都被干掉了。
創(chuàng)建對象(即new 的時候)的時候會執(zhí)行構(gòu)造函數(shù)胰蝠。
new關(guān)鍵字
Person zsPerson=new Person();
new幫助我們做了3件事兒:
1)歼培、在內(nèi)存中開辟一塊空間
2)、在開辟的空間中創(chuàng)建對象
3)茸塞、調(diào)用對象的構(gòu)造函數(shù)進(jìn)行初始化對象
namespace _02面向?qū)ο缶毩?xí)
{
class Student
{
//字段躲庄、屬性、方法钾虐、構(gòu)造函數(shù)
//析構(gòu)函數(shù) 構(gòu)造函數(shù)
//當(dāng)程序結(jié)束的時候 析構(gòu)函數(shù)才執(zhí)行
//幫助我們釋放資源
//GC Garbage Collection
//~Student()
//{
// Console.WriteLine("我是析構(gòu)函數(shù)");
//}
public Student(string name, int age, char gender, int chinese, int math, int english)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.Chinese = chinese;
this.Math = math;
this.English = english;
}
////public Student(string name, int chinese, int math, int english) : this(name, 0, 'c', chinese, math, english)
////{
//// //this.Name = name;
//// //this.Chinese = chinese;
//// //this.Math = math;
//// //this.English = english;
////}
public Student(string name, int age, char gender)
{
this.Name = name;
if (age < 0 || age > 100)
{
age = 0;
}
this.Age = age;
this.Gender = gender;
}
//public Student()
//{
//}
private string _name;
public string Name
{
get { return _name; }
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; }
}
private int _chinese;
public int Chinese
{
get { return _chinese; }
set { _chinese = value; }
}
private int _math;
public int Math
{
get { return _math; }
set { _math = value; }
}
private int _english;
public int English
{
get { return _english; }
set { _english = value; }
}
public void SayHello()
{
Console.WriteLine("我叫{0},我{1}歲了噪窘,我是{2}生", this.Name, this.Age, this.Gender);
}
public void ShowScore()
{
Console.WriteLine("我叫{0},我的總成績是{1}效扫,平均成績是{2}", this.Name, this.Chinese + this.Math + this.English, (this.Chinese + this.Math + this.English) / 3);
}
}
}
namespace _02面向?qū)ο缶毩?xí)
{
class Program
{
static void Main(string[] args)
{
//重載
Student s1 = new Student("李四", 100, '男');
Console.ReadKey();
//構(gòu)造函數(shù)
Student xlStudent = new Student("小蘭", 16, '女', 50, 50, 50);
xlStudent.SayHello();
xlStudent.ShowScore();
Console.ReadKey();
//Student s = new Student();
//s.Name = "張三'";
//s.Age = 18;
//s.Gender = '中';
//s.Chinese = 100;
//s.Math = 90;
//s.English = 90;
//s.SayHello();
//s.ShowScore();
//Console.ReadKey();
}
}
}
this 關(guān)鍵字
1)倔监、代表當(dāng)前類的對象
2)、在類當(dāng)中顯示的調(diào)用本類的構(gòu)造函數(shù) :this
往期回顧
- .Net基礎(chǔ)01
- .Net基礎(chǔ)02
- .Net基礎(chǔ)03
- .Net基礎(chǔ)04
- .Net基礎(chǔ)05
- .Net基礎(chǔ)06
- .Net基礎(chǔ)07
- .Net基礎(chǔ)08