
在面向?qū)ο缶幊趟枷胫?,大部分語(yǔ)言的編程思想都是面向過(guò)程。
面向過(guò)程
經(jīng)典例子:
把大象塞進(jìn)冰箱里
1、打開(kāi)冰箱門(mén)
2、把大象塞進(jìn)去,親下大象的屁股
3、關(guān)閉冰箱門(mén)
打開(kāi)----> 塞---->關(guān)閉
面向過(guò)程:面向的是完成這件事兒的過(guò)程,強(qiáng)調(diào)的是完成這件事兒的動(dòng)作。
小明 瘦小 矮 小屌絲
小明踩著小板凳打開(kāi)冰箱門(mén)
小明找翟盼盼幫忙把大象塞進(jìn)冰箱里,孫全踩著板凳去親。
小明踩著板凳關(guān)閉冰箱門(mén)
小剛 190cm 非常大力氣
1、小剛自己就能打開(kāi)冰箱門(mén)
2、小剛自己將大象塞進(jìn)冰箱里,翟可以自己親一下。
3、小剛自己關(guān)閉冰箱門(mén)
如果我們用面向過(guò)程的思想來(lái)解決這件事兒,當(dāng)執(zhí)行這件事的人的不同的時(shí)候,
我們需要為每個(gè)不同的人量身定做解決事情的方法。
面向?qū)ο?/p>
面向?qū)ο螅赫覀€(gè)對(duì)象幫你做事兒。
把大象塞進(jìn)冰箱里
我們把冰箱作為對(duì)象:
1、冰箱門(mén)可以被打開(kāi)
2、大象可以被塞進(jìn)冰箱里
3、冰箱門(mén)可以被關(guān)閉
面向?qū)ο螅阂庠趯?xiě)出一個(gè)通用的代碼,屏蔽差異。
以關(guān)門(mén)為例
關(guān)門(mén)
面向過(guò)程:關(guān)門(mén)
張三 一腳把門(mén)踹緊了
李四 輕輕的把門(mén)帶上了
王五 門(mén)沒(méi)關(guān)嚴(yán),留了個(gè)尾巴
面向?qū)ο螅宏P(guān)門(mén)
門(mén)可以被關(guān)閉
對(duì)象的描述
我們?cè)诖a中描述一個(gè)對(duì)象,通過(guò)描述這個(gè)對(duì)象的屬性和方法。
對(duì)象必須是看得見(jiàn)摸得著的。
燈:屬性和方法
屬性:
外形:長(zhǎng)的
亮度:500W
顏色:白色
牌子:XX
方法:發(fā)光
類(lèi)
我們把具有相同屬性和相同方法的對(duì)象進(jìn)行進(jìn)一步的封裝,抽象出來(lái) 類(lèi)這個(gè)概念。
類(lèi)就是個(gè)模子,確定了對(duì)象應(yīng)該具有的屬性和方法。
對(duì)象是根據(jù)類(lèi)創(chuàng)建出來(lái)的。
- 1、語(yǔ)法:
[public] class 類(lèi)名
{
字段;
屬性;
方法;
}
寫(xiě)好了一個(gè)類(lèi)之后,我們需要?jiǎng)?chuàng)建這個(gè)類(lèi)的對(duì)象,
那么,我們管創(chuàng)建這個(gè)類(lèi)的對(duì)象過(guò)程稱(chēng)之為類(lèi)的實(shí)例化。
使用關(guān)鍵字 new.
this:表示當(dāng)前這個(gè)類(lèi)的對(duì)象。
類(lèi)是不占內(nèi)存的,而對(duì)象是占內(nèi)存的。
- 2、添加類(lèi)的方法



以上兩種方法任意一種就好
*3、 代碼說(shuō)明
創(chuàng)建一個(gè)Person類(lèi)
namespace _01面向?qū)ο?{
public class Person
{
//字段名加下劃線(xiàn)
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類(lèi)的對(duì)象
Person xiaoMing = new Person();
xiaoMing._name = "小明";
xiaoMing._age = 18;
xiaoMing._gender = '男';
xiaoMing.CHLSS();
Console.ReadKey();
}
}
輸出結(jié)果

現(xiàn)在 讓我們來(lái)修改一下Main()函數(shù)中,對(duì)字段的賦值,再來(lái)看下輸出結(jié)果。
class Program
{
static void Main(string[] args)
{
//創(chuàng)建Person類(lèi)的對(duì)象
Person xiaoMing = new Person();
xiaoMing._name = "小明";
xiaoMing._age = -18;
xiaoMing._gender = '豬';
xiaoMing.CHLSS();
Console.ReadKey();
}
}

這結(jié)果就讓人尷尬了 。。。。。。 ┑( ̄Д  ̄)┍ 性別豬是什么鬼???可以看出現(xiàn)在并沒(méi)有什么可以限制字段對(duì)非法值的設(shè)定。這就需要屬性,來(lái)保護(hù)字段。
屬性
先上點(diǎn)解釋?zhuān)?br>
屬性的作用就是保護(hù)字段、對(duì)字段的賦值和取值進(jìn)行限定。
屬性的本質(zhì)就是兩個(gè)方法,一個(gè)叫get()一個(gè)叫set()。
既有g(shù)et()也有set()我們誠(chéng)之為可讀可寫(xiě)屬性。
只有g(shù)et()沒(méi)有set()我們稱(chēng)之為只讀屬性
沒(méi)有g(shù)et()只有set()我們稱(chēng)之為只寫(xiě)屬性
改下代碼
namespace _01面向?qū)ο?{
public class Person
{
//字段名加下劃線(xiàn)
private string _name;
public string Name
{
//當(dāng)你輸出屬性取值的時(shí)候 會(huì)執(zhí)行g(shù)et方法
get { return _name; }
//當(dāng)你給屬性賦值的時(shí)候 首先會(huì)執(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、將字段用訪(fǎng)問(wèn)修飾符 private 保護(hù)起來(lái)
private:私有的,只能在當(dāng)前類(lèi)的內(nèi)部進(jìn)行訪(fǎng)問(wèn),出了這個(gè)類(lèi)就訪(fǎng)問(wèn)不到了。
3、訪(fǎng)問(wèn)屬性 本質(zhì)上就是訪(fǎng)問(wèn)字段

還是原來(lái)的賦值代碼,但是輸出結(jié)果已經(jīng)顯示正常了
靜態(tài)和非靜態(tài)的區(qū)別
1)、在非靜態(tài)類(lèi)中,既可以有實(shí)例成員,也可以有靜態(tài)成員。
2)、在調(diào)用實(shí)例成員的時(shí)候,需要使用對(duì)象名.實(shí)例成員;
在調(diào)用靜態(tài)成員的時(shí)候,需要使用類(lè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)用實(shí)例成員
Person p1 = new Person();
p1.M1();//實(shí)例方法
//調(diào)用靜態(tài)成員
Person.M2();//靜態(tài)方法
Console.ReadKey();
}
}
}
總結(jié):
- 靜態(tài)成員必須使用類(lèi)名去調(diào)用,而實(shí)例成員使用對(duì)象名調(diào)用。
- 靜態(tài)函數(shù)中,只能訪(fǎng)問(wèn)靜態(tài)成員,不允許訪(fǎng)問(wèn)實(shí)例成員。
- 實(shí)例函數(shù)中,既可以使用靜態(tài)成員,也可以使用實(shí)例成員。
- 靜態(tài)類(lèi)中只允許有靜態(tài)成員,不允許出現(xiàn)實(shí)例成員。
使用:
1)、如果你想要你的類(lèi)當(dāng)做一個(gè)"工具類(lèi)"去使用,這個(gè)時(shí)候可以考慮將類(lèi)寫(xiě)成靜態(tài)的。
2)、靜態(tài)類(lèi)在整個(gè)項(xiàng)目中資源共享。只有在程序全部結(jié)束之后,靜態(tài)類(lèi)才會(huì)釋放資源。
構(gòu)造函數(shù)
作用:幫助我們初始化對(duì)象(給對(duì)象的每個(gè)屬性依次的賦值)
構(gòu)造函數(shù)是一個(gè)特殊的方法:
1)、構(gòu)造函數(shù)沒(méi)有返回值,連void也不能寫(xiě)。
2)、構(gòu)造函數(shù)的名稱(chēng)必須跟類(lèi)名一樣。
類(lèi)當(dāng)中會(huì)有一個(gè)默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù),當(dāng)你寫(xiě)一個(gè)新的構(gòu)造函數(shù)之后,不管是有參數(shù)的還是無(wú)參數(shù)的,那個(gè)默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù)都被干掉了。
創(chuàng)建對(duì)象(即new 的時(shí)候)的時(shí)候會(huì)執(zhí)行構(gòu)造函數(shù)。
new關(guān)鍵字
Person zsPerson=new Person();
new幫助我們做了3件事兒:
1)、在內(nèi)存中開(kāi)辟一塊空間
2)、在開(kāi)辟的空間中創(chuàng)建對(duì)象
3)、調(diào)用對(duì)象的構(gòu)造函數(shù)進(jìn)行初始化對(duì)象
namespace _02面向?qū)ο缶毩?xí)
{
class Student
{
//字段、屬性、方法、構(gòu)造函數(shù)
//析構(gòu)函數(shù) 構(gòu)造函數(shù)
//當(dāng)程序結(jié)束的時(shí)候 析構(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},我的總成績(jī)是{1},平均成績(jī)是{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)前類(lèi)的對(duì)象
2)、在類(lèi)當(dāng)中顯示的調(diào)用本類(lèi)的構(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
