【黑馬程序員】4.C#面向對象之類和構造函數

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

一、    

1、        類的定義

C#使用class關鍵字來定義類

語法:

              [訪問修飾符]class 類名

              {

                     數據成員;

                     函數成員;

              }

C#中,訪問修飾符有四種:

public:可以在程序的任何地方訪問

internal:只能在本項目中被訪問。

private:只能在本類中被訪問

protected:只能在本類或子類中被訪問

在類這個級別,定義類時不指定訪問修飾符的情況下,默認爲internal

而在類中定義變量或方法時不指定訪問修飾符,那麼默認爲private

下面定義一個名叫Person的類,Person類包含兩個數據成員和一個成員方法:

    public class Person
    {
        public string name;
        public int age;
        public Person() { }//無參構造函數
         public Person(string Name,int Age)//有參構造函數
         {
            this.name = Name;
            this.age = Age;
        }
        public void Hello(string Name, int Age)
        {            
            Console.WriteLine("Hello,我叫{0},今年{1}歲了!", Name, Age);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person onePerson = new Person("張三",30);
            onePerson.Hello(); 
            Console.ReadKey();
         }
    }
輸出:

2、   類的實例化

定義好一個類之後,需要創建類的對象才能使用,通過類產生一個對象的過程,就叫類的實例化。C#中我們使用new關鍵字來創建類的實例(也叫做對象)。

實例化類的語法:

                     類名對象名 new 類名();

如:                  Person lisi = new Person();

3、 加與不加static的區別

1)  不加static的方法又叫做實例方法,在調用之前必須先對類進行實例化,也就是創建一個類的對象,然後通過實例名.方法名 來訪問。

2)  加了static的方法叫靜態方法,它是屬於類本身的而不是屬於類的對象的,調用的時候不需要對類進行實例化,也就是說不需要創建類的實例,直接通過類名.方法名 來調用。

3)   使用原則:

靜態方法只能訪問類的靜態變量,不能訪問類的非靜態變量;

靜態方法只能使用類名來調用,不能使用實例來調用。

非靜態方法可以訪問類的靜態成員,也可以訪問類的非靜態成員;

非靜態方法必須通過類的實例來調用。

例:
        static void Main(string[] args)
        {         
            Test.CNGreet();//通過“類名.方法名”來調用靜態方法
              Test instance=newTest();//創建類的一個對象instance
            instance.EnglishGreet();//通過“實例名.方法名”來調用非靜態方法
              Console.ReadKey();
        }
        class Test
        {
            static string Sname="Jack";//靜態變量
              string name="Lily";//非靜態變量
             ///<summary>
           ///非靜態方法EnglishGreet()
           ///</summary>
           public void EnglishGreet()
           {
               //非靜態方法即可以訪問靜態成員又可以訪問非靜態成員
                 Console.WriteLine("How are you ?{0} , {1}", Sname, name);
           }
           ///<summary>
           ///靜態方法CNGreet()
           ///</summary>
           public static void CNGreet()
           {
               //靜態方法只能訪問靜態方法
                 Console.WriteLine("你好呀?,{0}!", Sname);
           }
        }

輸出:

二、     構造函數

C#中的構造函數是一種特殊的成員函數,它主要用於爲對象分配存儲空間,對數據成員進行初始化。

C#中的構造函數有以下主要特點:

(1)   C#構造函數的名字必須與類名相同;

(2)   C#構造函數沒有返回類型,它可以帶參數也可以不帶參數;

(3)   C#構造函數主要作用是完成對類的初始化的工作;

(4)   在創建一個類的新對象(使用new關鍵字)時,系統會自動調用構造函數初始化新對象;

(5)   當我們定義一個類之後,如果我們沒有寫構造函數,系統會爲我們自動添加一個默認的構造函數。一旦我們自己定義了一個構造函數,系統就不會再爲我們添加那個無參的構造函數了,所以此時最好自己手動再寫一個無參的構造函數,以方便使用。

(6)   利用 :this() 和 :base(),構造函數可以調用其他構造函數。

靜態構造函數只能對靜態數據成員進行初始化,而不能對非靜態數據成員進行初始化;非靜態構造函數既可以對靜態數據成員賦值,也可以對非靜態數據成員進行初始化。

三、     類的繼承中構造函數的調用問題

派生類對象的初始化是由基類和派生類共同完成的。當創建派生類的對象時,系統將會調用基類的構造函數和派生類的構造函數,構造函數的執行次序是:先執行基類的構造函數,再執行派生類的構造函數。至於執行基類的哪個構造函數,缺省情況下是執行基類的無參構造函數,如果要執行基類的有參構造函數,則必須在派生類構造函數的成員初始化列表中指出。

例:
    static void Main(string[] args)
    {
         B objB0 = new B("Class B");
         B objB1 = new B("Class A", "Class B");
         Console.ReadKey();
    }
	public class A
    {    
        public A()    //無參構造函數
        {        
            Console.WriteLine("Non Parameter!");    
        }    
        public A(string str)    
        {
            Console.WriteLine(str);    
        }
    }
    public class B:A	//B類繼承自A類
    {    
        public B(string strB):base() //先調用基類A中無參構造函數,再調用B類含一個參數的構造函數
         { 
            Console.WriteLine(strB);    
        }    
        public B(string strA,string strB):base(strA) //先調用基類A中含一個參數的構造函數,再調用B類含兩個參數的構造函數
         {        
            Console.WriteLine(strB);    
        }
    }
輸出:

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

詳細請查看:http://edu.csdn.net

發佈了33 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章