.Net基礎(chǔ)09 (面向?qū)ο?

編程思想.png

在面向?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)的方法
添加類(lèi) 方法1.png
添加類(lèi) 方法2.png
添加類(lèi) 方法2.png

以上兩種方法任意一種就好

*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é)果


輸出結(jié)果.png

現(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é)果.png

這結(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)字段

輸出結(jié)果.png

還是原來(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


往期回顧

圖文無(wú)關(guān).png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容