我們定義了yschool,yteacher類,例項化物件時:
yschool shool1 = new yschool();
shool1.id = 1;
shool1.name = "清華附中";
yschool school2 = new yschool();
school2.id = 2;
school2.name = "北師大附中";
這樣寫對不對呢,其實在邏輯上是不正確的,因為例項化物件時,它的屬性應該是和例項化一起就有的,而不是後來再加屬性。在程式中表現就是,屬性要有初值。
所以,在類中就要有這樣乙個方法,無返回型別,方法名和類名相同,有引數類表或者沒有引數列表。它就是構造方法,俗稱「構造器」或「建構函式」。乙個類中可以有乙個或多個建構函式,當然有時你沒寫建構函式,這並不代表這個類就沒有建構函式,它依然有乙個預設的建構函式的。如果使多個建構函式的話,它們各自的引數列表必須不同。
下面以yschool為例完善這個類。
/// /// yschool類的id和name是它的固有屬性,它的值應該是確定的。
/// 例項化的同時對屬性賦初值,用到建構函式。
///
public class yschool
}public string name
}/// /// 沒有引數的構造器稱之為「預設構造器」;如果沒有寫乙個構造器,那麼
///系統也會提供乙個預設的構造器,所以說類至少有乙個構造器;
///當然,如果系統提供的預設建構函式,則屬性初值為宣告時賦的初值,如果宣告
///未賦初值,則是「型別預設值」,比如0或者null。
///
public yschool()
/// /// 帶有引數列表的建構函式,
/// 屬性的值就是傳入的列表的值。
///
///
///
public yschool(int id, string name)
public yschool(int id)
}
class program
}
上面還修改了id和name的get/set屬性,都改為只有get,因為這些屬性值都是固有屬性,例項化之後再賦值也就不符合邏輯了。也就是這些屬性是唯讀的。
**中提到了預設值,這裡簡單說一下。在宣告欄位的時候,可以用賦值運算子「=」給字段直接加乙個值,比如
string name = string.empty;
這個不是給變數賦值,預設值只是一種形式,真正給變數賦值還是在建構函式中。一般規範的**都要求宣告變數時要賦初值的。如果生命時沒有賦值的字段,都會由編譯器增加一句賦值**,將該字段賦值為設定的預設值。其實,無論我們是否給字段增加了預設值,欄位都具備預設值的,只不過如果我們沒有人為增加預設值,欄位的預設值將是0或null。
這裡還有一點要注意,前面提到過系統預設的建構函式,但是當定義了建構函式後,系統預設建構函式就不存在了。因此如果某些情況下,既要用到預設建構函式和帶引數的建構函式,就要手動定義預設建構函式了。比如,
public yschool()
或者
public yschool()
綜上所述例項化類的規範表示式應該是:類名 例項名 = new 類名(構造函式引數列表); C 基礎知識整理 基礎知識(2) 類
類,是物件導向語言的基礎。類的三大特性 封裝 繼承 多型。最基本的特性就是封裝性。程式設計師用程式描述世界,將世界的所有事物都看成物件,怎麼描述這個物件?那就是類了。也就是用類來封裝物件。用書上的話說,類是具有相同屬性和行為的物件的抽象。寶馬汽車 別克汽車 五菱之光汽車.基本具有相同的屬性和行為,所...
C 基礎知識整理 基礎知識(2) 類
類,是物件導向語言的基礎。類的三大特性 封裝 繼承 多型。最基本的特性就是封裝性。程式設計師用程式描述世界,將世界的所有事物都看成物件,怎麼描述這個物件?那就是類了。也就是用類來封裝物件。用書上的話說,類是具有相同屬性和行為的物件的抽象。寶馬汽車 別克汽車 五菱之光汽車.基本具有相同的屬性和行為,所...
C 基礎知識整理
在c 98中,有63個關鍵字。不能遺漏標準名稱,任何不帶標準名稱來說關鍵字個數都是耍流氓 1.定義命名空間,需要用到namespace關鍵字,後面跟命名空間的名字,然後接 中即為命名空間的成員。2.命名空間的使用 namespace n int main using n b int main usi...