靜態方法和例項方法的關係與區別

2021-08-13 16:26:21 字數 3967 閱讀 4606

靜態方法

c++中,若類的方法前加了static關鍵字,則該方法稱為靜態方法,反之為例項方法。靜態方法為類所有,可以通過物件來使用,也可以通過類來使用。但一般提倡通過類名來使用,因為靜態方法只要定義了類,不必建立類的例項就可使用。

靜態方法只能用類的靜態成員。

靜態方法的定義

若類的方法前加了static關鍵字,則該方法稱為靜態方法,反之為非靜態方法。

靜態方法的使用

靜態方法與靜態變數一樣,屬於類本身,而不屬於那個類的乙個物件。要想呼叫乙個被定義為static的方法,必須在它前面加上這個類的名稱。

例項方法必須通過類的例項來使用。例項方法可以使用類的非靜態成員,也可以使用類的靜態成員。

類的靜態方法,靜態變數是在類裝載的時候裝載的。但是要特別注意,類的靜態變數是該類的物件所共有的,即是所有物件共享變數。所以建議盡量少用靜態變數。盡量在靜態方法中使用內部變數。

宣告  其中static關鍵字即表示靜態的。宣告靜態方法的語法如下:

《訪問修飾符》 static返回型別方法名(引數列表)

呼叫靜態方法與例項方法唯一不同的,就是靜態方法在返回型別前加static關鍵字。靜態方法的呼叫有兩種途徑:

(1)通過類的例項物件去呼叫

呼叫格式為: 物件名.方法名

(2) 通過類名直接呼叫

呼叫格式為: 類名.方法名

使用規則

我們在使用時要注意:

靜態方法只能訪問類的靜態成員,不能訪問類的非靜態成員;

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

靜態方法既可以用例項來呼叫,也可以用類名來呼叫。

**示例

using system;

namespace teststatic

public void ******print()

console.writeline("x=" + x + ",y=" + y); }

public static void staticprint()

", y);

console.writeline("x=",x); //靜態方法中不能使用非靜態成員

}}class test

}}實際應用

1. 有靜態屬性的類,一般會定義靜態方法。

2. 沒有屬性的類,一般會定義靜態方法,這樣在使用時,通過類名::方法名即可呼叫,

而不用先定義物件,再呼叫,這樣可以省去一行**。

靜態方法經典案例

(1)用於對靜態字段、唯讀欄位等的初始化。

(2)新增static關鍵字,不能新增訪問修飾符,因為靜態建構函式都是私有的。

(3)類的靜態建構函式在給定應用程式域中至多執行一次:只有建立類的例項或者引用類的任何靜態成員才激發靜態建構函式

(4)靜態建構函式是不可繼承的,而且不能被直接呼叫。

(5)如果類中包含用來開始執行的 main 方法,則該類的靜態建構函式將在呼叫 main方法之前執行。任何帶有初始值設定項的靜態字段,則在執行該類的靜態建構函式時,先要按照文字順序執行那些初始值設定項。

(6)如果沒有編寫靜態建構函式,而這時類中包含帶有初始值設定的靜態字段,那麼編譯器會自動生成預設的靜態建構函式。

以下用例子**進一步說明:

using system;

class a }class b static void main()

① 程式入口,

如果類中包含用來開始執行的 main 方法,

該類的靜態建構函式將在呼叫 main 方法之前執行。

轉到b的靜態建構函式----> ,y = ", a.x, b.y);

⑤ 輸出結果 console.readline(); } }

靜態方法的弊端

在一些系統中使用非常頻繁的方法都使用靜態方法可以提高系統效能

本身不可公升級,重寫,這要看乙個軟體產品的目的是什麼了.

為了方便,不用例項化,但這樣程式編譯執行時就占用了系統資源

靜態的屬性和方法在程式啟動的時候,就全部裝入記憶體的,而不管這些方法、屬性以後有沒有用到。即使是沒有人再訪問程式,這部分記憶體仍然不會釋放還有就是,所有訪問者看到的靜態屬性的資料幾乎都是一樣的,比如a使用者設定了username這個屬性,b使用者訪問的時候,得到的username仍然是a使用者設定的那個。這種特性,如果用在固定資料中,那不會有太大問題,比如連線字串之類的

靜態方法/資料成員是屬於類的,不是屬於某乙個物件的,因而呼叫它不需要例項化;靜態方法和靜態資料成員相當於共享變數。為該類的所有物件所共有,因而在需要共享資料時,定義這種型別時很好的選擇。一但定義乙個類後(不一定要例項化物件)該類的所有靜態成員就載入記憶體(並不是程式啟動,就裝入記憶體,沒有定義該類時它不會載入記憶體) 靜態成員的作用域與它所屬的類的作用域相同

使用了static 修飾符的方法為靜態方法,反之則是非靜態方法。

下面我們分四個方面來看看c#靜態方法與非靜態方法的差異:

c#靜態方法與非靜態方法比較

一、c#靜態成員:

①靜態成員屬於類所有,非靜態成員屬於類的例項所有。

②每建立乙個類的例項,都會在記憶體中為非靜態成員新分配一塊儲存;

非靜態成員屬於類所有,為各個類的例項所公用,無論類建立了多少例項,

類的靜態成員在記憶體中只佔同一塊區域。

c#靜態方法與非靜態方法比較

二、c#靜態方法

1、c#靜態方法屬於類所有,類例項化前即可使用。

2、非靜態方法可以訪問類中的任何成員,靜態方法只能訪問類中的靜態成員。

3、因為靜態方法在類例項化前就可以使用,而類中的非靜態變數必須在例項化之後才能分配記憶體,

這樣,c#靜態方法呼叫時無法判斷非靜態變數使用的記憶體位址。所以無法使用。而靜態變數的位址對類來說是固定的,故可以使用。

c#靜態方法與非靜態方法比較

三、c#靜態方法是一種特殊的成員方法

它不屬於類的某乙個具體的例項,而是屬於類本身。所以對靜態方法不需要首先建立乙個類的例項,而是採用類名.靜態方法的格式 。

1.static方法是類中的乙個成員方法,屬於整個類,即不用建立任何物件也可以直接呼叫!

static內部只能出現static變數和其他static方法!而且static方法中還不能使用this....等關鍵字..因為它是屬於整個類!

2.靜態方法效率上要比例項化高,靜態方法的缺點是不自動進行銷毀,而例項化的則可以做銷毀。

3.靜態方法和靜態變數建立後始終使用同一塊記憶體,而使用例項的方式會建立多個記憶體.

4.c#中的方法有兩種:例項方法,靜態方法.

c#靜態方法與非靜態方法比較

四、c#靜態方法中獲取類的名稱

靜態方法中用:

1. string

2. 3.

非靜態方法中還可以用:

1. stringthis

c#靜態方法與非靜態方法的區別解析旨在詮釋c#靜態方法的含義,希望對你了解和學習c#靜態方法與非靜態方法有所幫助。

觀點1:

這是乙個經常被時時提出來的問題,很多時候我們以為理解了、懂了,但深究一下,我們卻發現並不懂。

方法是我們每天都在寫得,很多程式設計師大多都使用例項化方法,而很少使用靜態方法,問原因也說不出來所以然,或者簡單的回答兩者定義的區別,靜態方法不需要new就可以使用例項化方法需要new了以後才可以使用。。。。我們真的理解了嗎?

從實際專案開發說起,這裡有開發專案的三種方式:

開發專案中把bll和dal分開,在bll呼叫dal的**。

一、在dal中使用靜態方法,不建立例項直接呼叫(大概有很多人都使用這種方式開發 )

class dal

在bll中呼叫:

dal.getusername();

二、在dal中使用例項方法,採用靜態成員模式(或singleton)通過例項來呼叫:

class dal

在bll中呼叫:

dal.dal.getusername();

三、在dal中使用例項方法,每次呼叫之前先建立dal物件的例項:

class dal

在bll中呼叫:

dal dal = new dal();

dal.getusername();

靜態方法和非靜態方法區別

開發方式三 應該是普遍使用的,能夠相容各種問題,也不會有執行緒不安全的嫌疑出現。特別說明一下 在ms的pet3.0以前的版本都採用了方式二,而到pet3.0和以後的版本都採用了方式三,而且特別在開發說明文件中明確的解釋了一下。我想應該是從相容性上考慮的,從效能上方式二並不比方式三真正的高多少。觀點2...

例項 物件導向的分析與設計方法

一 相關知識與教學意圖說明 1 相關知識 1 物件導向的分析與設計 ooa ood 有專門的課程 2 uml 一種基於物件導向方法的標準建模語言 用於描述軟體的需求與設計方案 有專門的課程 3 教材第9章 自行閱讀 2 課程意圖 不講述具體的知識,而是針對乙個特定的案例 乙個規模不大的應用軟體,不考...

國標與美標檢測方法的區別

紡織品各項物理指標的檢測方法和評定方法各國是不同的,一般買家指定檢測方法標準,主要有 gb,是中國標準 iso,適用於歐洲國家 aatcc和astm,適用於美洲國家 bs,適用於英國 as,適用於澳大利亞和紐西蘭 din,適用於德國 jis,適用於日本 iws,適用於世界上絕大多數國家,主要是指羊毛...