【C#基礎】面向物件
一、為什麼需要面向物件:
在面向物件出現之前,結構化程式設計是程式設計的主流,被稱為”面向過程“的程式設計。
面向過程的開發方法,通常會存在以下問題:
1、軟體複用性差
2、軟體可維護性差
3、軟體靈活性差
面向物件程式設計思想中的物件,是一種具有狀態(屬性)和行為(方法)的資料結構,用於描述現實世界的某個事物,將現實世界的事物模型化。
二、物件與類的關係:
類:對事物的一種抽象定義;
物件:客觀存在的具體事物。
2.1、建立類和物件:
宣告類:class className //<類名>
{
//Fields<欄位> 儲存資料
//Properties<屬性> 保護欄位,對欄位的取值和設值進行限定,屬性的本質就是兩個方法
//Methods<方法> 描述物件的行為
//建構函式 初始化物件(給物件的屬性依次賦值)
//類中的成員,如果不加訪問修飾符,預設為Private
}
建立物件:className Object=new Constructor(引數列表);
類名 物件名 構造方法()
類是不佔記憶體的,而物件是佔記憶體的。在物件被建立時,會自動呼叫建構函式初始化物件;
2.2、欄位與屬性:
1、欄位:類的成員,用於描述一類事物的某個特徵的變數。
【舉例】:Employee類中具有很多的特徵(如姓名、年齡等),在定義類時即可用兩個欄位分別儲存員工的姓名和年齡。
class Employee //宣告類
{
public String employeeName;//員工的姓名欄位
public int emlioyeeAge;//員工的年齡欄位
}
Employee employee=new Employee();//建立物件(例項化物件相當於實實在在存在的一個人,類只是抽象的定義一個人的類)
employee.employeeAge=20;//通過物件使用欄位,給物件賦值年齡。
2、屬性:對欄位的封裝,用於阻止非法資料的輸入,從而保護內部資料的安全。
【封裝】:隱藏內部實現、對外提供公共操作的方式。
物件就是封裝了資料和操作這些資料的程式碼的邏輯實體。
在一個物件內部,某些程式碼和資料不能被外界訪問,物件通過這種方式對內部資料提供不同級別的保護,用於防止程式中的隱藏部分由於意外而被改變或被錯誤操作。
【訪問修飾符】:從上到下,私有程度逐漸降低
private:只能在本類中使用
protected:在本類中及其子類中可以使用
internal:同一名稱空間(程式集)中的類可以使用
public:所有類均可使用
【舉例】:Employee類中具有很多的特徵(如姓名、年齡等),在定義類時即可用兩個欄位分別儲存員工的姓名和年齡。
public enum Gender
{
man,
woman
}
class Employee//宣告員工類
{
private String employeeName;//員工的姓名欄位
public String EmployeeName
{
get { return employeeName; }
set { employeeName = value; }
}
private Gender gender;
public Gender Gender
{
get
{
//在Get方法裡對非法值進行限定
if (gender != Gender.man && gender != Gender.woman)
{
gender = Gender.man;
}
return gender;
}
set { gender = value; }
}
private int employeeAge;//員工的年齡欄位
public int EmployeeAge
{
get { return employeeAge; }
set
{
//在Set方法裡對非法值進行限定
if (value <= 0 || value > 100)
{
employeeAge = 18;
Console.WriteLine("年齡設定錯誤!");
}
else
{
employeeAge = value;
}
}
}
/// <summary>
///
/// </summary>
public Employee(string name, Gender gender, int age)
{
this.EmployeeName = employeeName;
//在建構函式裡對非法值進行限定
if (gender != Gender.man && gender != Gender.woman)
{
gender = Gender.man;
}
this.Gender = gender;
this.EmployeeAge = employeeAge;
}
}
Employee employee=new Employee();//建立物件(例項化物件相當於實實在在存在的一個人,類只是抽象的定義一個人的類)
employee.employeeAge=20;//設值,自動呼叫屬性EmployeeAge中的set訪問器
Console.WriteLine("該員工的年齡是:{0}",employee.EmployeeAge);//取值,自動呼叫屬性EmployeeAge中的get訪問器
2.3、方法:(例項方法)面向物件程式設計中,物件可以執行的操作被稱為方法。
1、方法的定義和呼叫:
【語法】:訪問修飾符 返回值型別 方法名(引數列表)
{
方法體;
}
【注意】:引數列表可以為空,但括號不能省略;存在多個引數時,需要使用逗號分隔。
返回值型別可以是c#中的任意型別;也可以沒有返回值,若沒有返回值則必須使用Void.
方法體中無論有多少行程式碼都必須使用括號將其括起來。
【呼叫】:
a、同一類中的方法直接通過方法名進行呼叫;
b、同一名稱空間不同類中的方法呼叫方式如下:
⑴、建立物件;//類名 物件名=new 構造方法();
⑵、通過物件名.方法名進行呼叫。//物件名.方法名();
c、不同名稱空間中的方法呼叫方式如下:
⑴、匯入名稱空間;//using 名稱空間
⑵、建立物件;
⑶、通過物件名.方法名進行呼叫。
2、構造方法:類被例項化時首先執行的一種特殊方法,用於完成物件屬性的初始化操作。(在建立物件的同時將屬性初始化)
【注意】:一個類中若沒有定義任何構造方法,則執行環境會提供一個無參的構造方法。
【分為】:無參的構造方法和有參的構造方法。
//建構函式,函式名與類名相同
//建構函式沒有返回值,連Void都不用
【語法】:訪問類名(引數列表)
{
語句塊;
}
【舉例】:class Employee
{
public Employee(String employeeName,int employeeAge)//建立一個有參的建構函式
{
EmployeeName=employeeName;
EmployeeAge=employeeAge;
}
}
//建立物件
Employee employee=new Employee("Jack",20);
3、靜態方法:(類方法)通過satic關鍵字修飾的方法
【語法】:訪問修飾符 static 返回值型別 方法名(引數列表)
{
方法體;
}
靜態和非靜態的區別
1)、在非靜態類中,既可以有例項成員,也可以有靜態成員。
2)、在呼叫例項成員的時候,需要使用物件名.例項成員;
在呼叫靜態成員的時候,需要使用類名.靜態成員名;
總結:靜態成員必須使用類名去呼叫,而例項成員使用物件名呼叫。
靜態函式中,只能訪問靜態成員,不允許訪問例項成員。
例項函式中,既可以使用靜態成員,也可以使用例項成員。
靜態類中只允許有靜態成員,不允許出現例項成員。