物件導向(基礎oop)之屬性與建構函式

2022-04-29 07:45:12 字數 3118 閱讀 5458

需要記得:1.在1個專案中 不能 直接訪問 另外的1個專案中的類.

2.在為物件的字段賦值的時候.語法上只要賦值的資料和字段的型別一致就可以.

但是絕大多數情況下.還要考慮實際情理.

比如:人物件的age欄位 表示1個人的年齡 是int型別

語法上只要是1個int型別的資料都可以賦值.

但是情理上. 人物件的age 0-130歲.

3. 為了情理,我們有以下的需求

為物件的字段賦值的時候 要求這個值 符合情理. 而不是僅僅滿足語法.

這個需求是寫類的那個人的需求 而不是建立物件的那個人的需求.

解決方案:

a. 目的: 當外界為物件的字段賦值的時候.可以對這個值做1個邏輯驗證.

b. 步驟

1). 要保護的字段必須私有化. 因為一旦public 那麼外界就可以直接訪問這個欄位.

就可以直接為這個賦值,無法阻攔.

2). 但是一旦私有化,外部1點機會都沒有.

那麼我們在類中提供1個為被保護的字段賦值的方法. setxx()

這個方法接收1個引數,這個引數就是外界要賦值給字段的值.

在方法的內部 對這個值進行邏輯驗證. 符合邏輯就將值賦值給字段.

不符合邏輯 我們就做預設處理.

3). 在外界如果要為物件的字段.需要呼叫這個方法才可以為字段賦值.

4). 外界如果想要得到保護的字段的值,那麼再寫1個getxx方法 用於專門返回被保護的字段的值

外界通過呼叫這個方法 得到欄位的值.

c. set 設定

get 得到.

d. 有同學犯錯:

1). 被保護的字段一定要私有化.

2). 在賦值的方法中.是要判斷使用者準備賦值給字段的資料是否符合規範. 而不是判斷欄位的值.

4. 在方法中可以定義1個區域性變數的名稱和成員變數的名稱相同 這是可以滴.

為什麼? 因為成員變數跟隨著物件一起開闢在堆空間中.

而區域性變數 在方法被呼叫的時候 開闢在棧空間中

他們就算同名 1個在堆 1個在棧 是不會有任何影響的.

如果在方法中直接訪問這個同名成員成員的值 那麼訪問的是區域性變數的值.

如果我們就是要訪問這個同名的成員變數. 這個時候可以通過this關鍵字來點出這個同名成員.

this代表:當前物件. this所在的方法屬於哪個物件,那麼this就代表這個物件.

總結:1. 當方法中有1個區域性變數的名稱和字段的名稱相同.如果我們要訪問欄位.必須加上this

2. 其他情況下: 寫不寫this關鍵字 指的都是字段.

但是建議: 在方法中如果我們訪問的是物件的成員 建議加上this 方便**的閱讀

為什麼要保護字段??

希望對物件的字段賦值,賦值的這個資料在情理範圍之內。

使用方法保護欄位.

a. 將被保護的字段私有化.

b. 提供1個set方法 專門用於為被保護的字段賦值.

在這個方法中驗證 賦值 的資料是否符合規範.

如果符合就賦值 如果不符合做預設處理.

c. 再提供1個get方法 專門用於返回被保護的字段的值.

1.屬性

作用:和get,set方法一樣的,是用來保護字段,只不過屬性的語法更簡潔。

2.屬性的語法:

訪問修飾符 屬性的型別 屬性的名稱

set{}

}3.如何操作?

可以向操作字段那樣,通過賦值符號直接賦值,或者直接寫上屬性取值。

1.建構函式/構造方法 : 建構函式是乙個特殊的方法。

2.建構函式的語法:

a.訪問修飾符大都數情況下是public。

b.建構函式沒有返回值,連void都不要寫。

c.建構函式的名稱與所在的類的名稱一致。

3.方法的特點在於,如果方法不呼叫,那麼方法中的**不會被執行。

建構函式不能被程式猿手動呼叫。

我們發現,在建立物件的時候,後面有乙個小括弧。

小括弧的作用:

a.改變運算的優先順序

b.定義方法

c.呼叫方法

d.強制型別轉換

e.呼叫建構函式

總結:建構函式在建立雖然不能直接呼叫,可是可以通過new關鍵字自動呼叫。

4.注意:

a.建構函式的名稱一定是與所在的類的類名相同。

b.建構函式與普通的方法的區別

1)語法上的區別

2)執行時機

5.建構函式其實就是乙個特殊的方法

特殊的地方

1)語法上的特殊

2)執行時機的特殊

6.普通的方法可以帶引數,建構函式也是可以帶引數的。

在建立物件的時候,後面的小括弧是在呼叫物件的建構函式,必須在小括弧中為建構函式定義引數。

在建立物件的時候,必須要呼叫建構函式。

7.建構函式是可以過載的,這就意味著在物件中可以載入多個方法。

8.建構函式的作用:

特點:在於建立物件的時候自動呼叫。

作用:如果我們有一段**希望在建立物件的同時就執行,那麼我們就可以將這段**放在建構函式中。

但是,一般情況下,不建議在建構函式中寫一些特別消耗時間和效能的**。

絕大多數情況下,程式設計師使用建構函式來初始化當前的屬性的值。

9.如果我們沒有寫建構函式,那麼c#編譯器在編譯的時候,會自動的為這個類生成乙個無引數的,空方法體的建構函式。

所以我們這個時候才可以呼叫無引數的建構函式來建立物件。

編譯器自動生成的這個無引數的建構函式來建立物件。

編譯器自動生成的這個無引數的建構函式,我們就把它稱為「隱式建構函式」;

一旦程式設計師為這個類寫了乙個建構函式,那麼編譯器就不會自動生成  「隱式建構函式」了。

如果就是希望存在哪個無引數,,那麼就需要重新建立乙個建構函式。

10.建構函式式不能被程式設計師手動呼叫,在普通的方法不能呼叫建構函式,但建構函式可以呼叫普通的方法。

建構函式之間可以相互呼叫

物件導向(OOP)基礎

1 物件導向特性 封裝 繼承 多型。2 oop概念 類 class 物件 object 字段 field 描述類的某些性質。屬性 attribute 通過方法訪問和操作字段。方法 method 定義類的行為。3 類的建立 修飾符 class 類名 class computer 4 物件的宣告 例項化...

物件導向(基礎oop)之進入繼承

1.繼承的目的雖然是讓子類去擁有父類的成員,但是繼承一定不要亂繼承 不要僅僅是為了去得到某1個類的成員而去繼承.滿足繼承的關係 當滿足is a 的關係的時候,就可以繼承.當子類是1個父類的時候 那麼就可以繼承.student person class student person 麻雀 鳥 汽車 交...

Python基礎 物件導向OOP

魔法函式 物件導向概述 幾個名詞 類和物件的概念 類的內容,應該具有兩個內容 類的基本實現 如何宣告乙個類 可以通過缺省內置變數檢查類和物件的所有成員 類的所有成員檢查 定義乙個學生類,用來形容學生 class student 乙個空類,pass代表跳過 pass必須有 pass 定義乙個物件 zs...