天天看點

C#基礎篇--面向對象(類與對象)

1.類是什麼?

   類就相當于模闆,就是把同一類的事物的共同特征進行的抽象。

  類的建立和說明:

    類是先根據一些具體的對象(實體的東西)來抽象出來的共同的特性,然後用代碼來表示. 

    在類中,用資料表示事物的狀态,用函數(方法)實作事物的行為動作。

    當建立一個類時,系統會預設的添加一個構造函數,如果使用者自己寫一個構造函數則會覆寫這個預設的構造函數。當然構造函數也是可以重載的。

    構造函數的特點:

    1. 構造函數名必須與類名相同。
    2. 不能有任何的傳回值類型。
    3. 通路修飾符一般都是Public.

      如果一個類中有一個構造函數,并且這個構造函數用的Private修飾的,那麼這個類是不能執行個體化的。因為要執行個體一個類時,必須去調用這個類的構造函數。是以可以寫在這個類中寫一個靜态的方法,在方法中來執行個體這個類。    

    方法的重寫:

          是與參數的個數和參數的類型有關,與傳回值沒有關系。

   說到了類和方法,那麼就有必要的說一下變量的作用域了:  

      是聲明這個變量與最近的大括号的内部。

      局部變量必須要先指派後才能夠使用。

      而類的成員變量是可以不用指派,就可以先使用,因為構造函數是會初始化這個變量的。 

      如果在一個方法中聲明了一個與類的成員變量相同的變量,那麼在使用時,調用類的成員變量要用this 與之區分開,如果不用this 那麼方法中的變量要優先于成員變量。This就是表示目前類的對象。

2.對象是什麼?

  對象就是指某一個具體的事務。在程式中它是類的一個執行個體。簡單的說就是New出來的。

3.面向對象是什麼?

  面向對象是一種分析問題的方式 主要的作用就是增加程式的可擴充性。

    面向對象的優點:

    它能夠建構與現實世界相對應的問題模型,并保持他們的結構、關系和行為模式。  

  面向對象的三大特性: 封裝、繼承、多态。

    封裝:  

    就是把事物的狀态和行為封裝在類中,使用類的人不需要知道類内部是怎麼實作的,隻要調用其中的屬性和方法實作功能就行了。

    在程式中封裝具體的實作:

    1.   屬性封裝了字段。
    2.   将多個方法封裝成一個對象。
    3.   将一堆代碼封裝到一個方法中。
    4.   将一些功能封裝到了幾個類中。
    5.   将一些具有相同功能的代碼封裝到一個程式集中(dll 、exe),并且對外提供統一的通路接口。(例:公司的每個部門的部門經理,與其他部門協作。)

    繼承:

     它是指類與類之間的關系,并且類是不能互相繼承的。如果一個類沒有顯示繼承自任何一個類,預設是繼承Object類(Object類是所有類的的父類)。如果顯示指定了目前類的繼承自某個類,則将覆寫預設的Object類。    

    繼承的優點 :

    1.   代碼的重用
    2.   多态(裡氏替換原則LSP)(程式的可擴充性、靈活性),下面說明
    3.      子類繼承父類的屬性、方法、字段,使建立子類變得很簡單,實瑞了代碼的重用,和多态。但要記的子類隻能繼承父類中非私有的東西。

    繼承後關于構造函數的問題:      

      1.類的構造函數是不能被繼承的。隻能在子類中去調用父類的構造函數。

      2.子類的構造函數會預設去調用父類中的無參數的構造函數,當然也可以自己來設定調用父類的哪一個構造函數。

                    (1)當在父類中寫了帶參的構造函數,記的要再增加一個無參的構造函數,(這也說明構造函數是可以重載的。)因為當自己在類中寫了構造函數會覆寫系統預設的構造函數。

                    (2)當然也可以在子類的構造函數加上:base(父類構造函數要傳的參數),這樣就是調用父類中帶參數的構造函數了。

      3.在目前類的構造函數中去也可以去調用目前類的另一個構造方法。用:this(參數),這樣可以少寫構造函數裡的内容了。

      注意:在構造函數中如果用this()就不能再用:base(),相反也是一樣的。

    

      當調用從父類中繼承過來的成員的時候,如果子類沒有重寫則this.成員與base.成員是沒有差別的。如果子類重寫了父類成員,則this.成員,調用的是子類重寫以後的。Base.成員,調用的依然是父類的成員。      

      類的單根繼承性:一個子類隻能繼承一個父類。

      類的傳遞性:子類繼承父類的方法和屬性等,同時還繼承了父類的父類的屬性和方法。

      重要的特性: 父類對象可以引用子類執行個體,它編譯的是父類對象,但運作卻是一個子類對象。具體特征:

                   被聲明為父類對象,擁有父類的屬性等,占用子類的記憶體空間,子類方法覆寫父類的方法時,此時對象調用的是子類的方法;否則自動調用繼承父類的方法,也就是說父類不能去調用子類中獨有的成員。      

      關于父類中私有成員是否被繼承的問題

      個人觀點:所有私有成員沒有被繼承。是指沒有辦法去通路,并不代表記憶體中不存在。

      例如:兒子繼承了父親的一千萬,但不能花。 

      通路級别的問題:(兒子能去的地方爹一定要能去)

                   子類的通路級别必須比父類的級别要低或相同。

                   目前類中的成員的通路級别不能比所對應的類型通路級别高(包括方法的參數。)

      

    多态:

     多态就是多種表現的形态, 具體的是指不同對象收到相同消息時,會産生不同行為,同一個類在不同的場合下表現出不同的行為特征。    

     實作多态的主要手段: 1.虛方法virtual, 2抽象方法Abstract 3接口。

      虛方法使用:

      1.     虛方法必須有方法體,當然方法體中可以不寫内容
      2.     子類繼承父類,其實父類的虛方法可以重寫,也可以不重寫。
      3.     虛方法可以寫在普通類中

     

      虛方法與抽象方法的差別:

        1.虛方法必須有方法體,抽象方法不能有方法體。

        2.抽象方法必須在抽象類中聲明,虛方法可以出現在抽象類中也可以在普通類中聲明。

        3.抽象方法必須在子類中重寫,虛方法可以被重寫,也可以不重寫。

    多态的作用:

      把不同的子類對象當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的程式設計,以适應需求的不斷變化。

    多态的含義:

      使得能夠利用基類的指針來引用不同子類的對象,以及根據所引用對象的不同,以不同的方式執行相同的操作。

    總結的說多态的意義就是為了程式可擴充性,并且節省成本和提高效率。  

每一天都是嶄新的,我們的目标有多遠,我們就能走多遠,堅持!!