【內容】
1.面向對象
對象:萬物皆對象,即對象就是可以看到、感覺到、聽到、觸摸到或聞到的東西。
術語:對象是一個自包含的實體,用一組可識別的特性和行爲來標識。
1.1類
類是具有相同屬性和功能的對象的抽象的集合。
類和對象:
(1)類是抽象的概念,僅僅是模板;
(2)類是不佔內存的,對象佔內存;
(3)類是對象的抽象,而對象是類的具體實例。
2.修飾符
private:私有成員,在類的內部纔可以訪問。
protected:保護成員,該類內部和集成類中可以訪問。
public:公共成員,完全公開,沒有訪問限制。
internal:當前程序集內可以訪問。
3.類的實例化(怎麼使用)
語法格式:
類 實例名 = new 類();
類成員的訪問:
實例名.屬性 實例名.方法();
字段、屬性、方法都可以叫做類的成員,他們需要定義訪問級別。訪問級別的用處在於控制成員在哪些地方可以被訪問,這樣達到面向對象中“封裝的目的。
4.屬性
屬性的定義:get;set;
屬性可分爲:讀寫、只讀、只寫;允許外部訪問的變量一定要聲明爲屬性。
屬性的讀寫
private string _name;
//訪問修飾符是private,那麼這個字段就是私有的,外邊不能訪問,可以通過屬性在外面或其他地方進行訪問
//屬性
public string Name
{
get { return _name; } //讀
set { _name = value; } //寫
}
5.構造函數
解決了賦值麻煩的章程;在只讀狀態下,不能隨便賦值,使用構造函數來賦值。
構造函數是用來創建對象的特殊方法,方法名和類名一樣,沒有返回值,連void都不用。
舉例:(構造函數)
public Person(string name,char gender,int age)
{
this._name = name;
this._gender = gender;
this._age = age;
}
構造函數給字段賦值:
Person per = new Person("小楊",'男',18); //利用構造函數給裏面的字段賦值
per.Show();
Console.ReadKey();
另外,( Person per = new Person(); )
如果寫一個類沒有寫任何的構造函數,那麼這個類有個默認的無參數的構造函數;
若再寫一個有參的構造函數,則有參數構造函數將會覆蓋原來默認的無參構造函數。
6.命名空間
namespace(命名空間),用於解決類重名的問題,可以看做“類的文件夾”。
如果代碼和被使用的類在一個namespace則不需要using。
在不同命名空間下的類調用有兩種方法:
(1)寫全稱 命名空間.類名
(2)先using引用命名空間,再調用
如果一個項目中需要用到另一個項目中的類,需要先添加引用,再導入命名空間(或寫全稱)。
7.值類型和引用類型
值類型:將一個值類型變量賦給另一個值類型變量時,將複製包含的值。
引用類型:引用類型變量的賦值只複製對對象的引用,而不復制對象本身。
值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也可以實現接口。
其中,值類型不可能包含 null 值;每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
值類型和引用類型有哪些
引用類型:類、數組、棧上的地址、堆上的值
值類型:結構、棧上存的是值、Int、decimal、bool、double byte等基本數據類型、枚舉結構類型
類和結構
類:引用類型
值類型的值存在棧上,引用類型的棧上存的是地址,值存在堆上。
類中默認的有一個無參數的構造函數
當在類中寫一個有參數的構造函數,默認無參數的構造函數被覆蓋了。
類中寫構造函數參數列表中參數個數可以不確定。
結構:值類型
在結構中默認的也有一個無參數的構造函數
當在結構中寫一個有參數的構造函數,默認的無參數的構造函數還有,沒被覆蓋。
在結構中寫構造函數,要把所有的字段都要完全賦值。
堆和棧
棧:是編譯期間就分配好的內存空間,因此代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。
堆:是程序運行期間動態分配的內存空間,可以根據程序的運行情況確定要分配的堆內存的大小。
8.繼承
Public class Teacher : Person //Teacher繼承了Person類
Public class Student : Person //Student同樣繼承了Person類
其中,
Person是父類(基類),Teacher、Student是子類(派生類)
子類繼承了父類的成員(屬性和方法),子類還可以有自己的成員。
在C#中,所有的類都直接或間接的繼承了object類。
9.里氏轉換
子類可以賦值給父類;
子類可以隱式的轉換成父類。
//如果new的時候,new的是子類,那麼再轉換這個子類是可以的
Person p = new Teacher();
Teacher t = (Teacher)p;
判斷
is用法
Person p = new Person();
If (p is Teacher)
{
Teacher t = (Teacher)p;
t.Say();
}
Else
{
Console.WriteLine(“轉不了”);
}
Console.ReadKey();
As用法
Person p1 = new Person();
Teacher t1 = p1 as Teacher;
t1.Say();
is返回的是bool值, true就是能轉換,false就是不能轉換。
as也是轉換,如果轉換不了的不報異常,返回來爲null。