靜態方法不用new對象可以直接調用
與類相關與對象無關
不需要對象的輕方法
工廠方法
如果某個方法是用頻率較高或者方法本身通用性較強無需初始化類成員變量則可以使用靜態方法那樣方便速度也快
可以直接拿來就用的方法就算是靜態的
肯定不涉及具體對象因為靜態方法內是無法直接使用任何非靜態成員的
(1)制作工具類
()可以當作"作局"對象或方法來使用
(1)重載"操作符"
()C#中的擴展方法(配合C#的擴展事件引領C#向動態語言的方向發展)
靜態方法和實例方法是一樣的在類型第一次被使用時加載調用的速度基本上沒有差別
靜態方法不用創建實例就可調用比較簡單從面向對象的角度上來說在抉擇使用實例化方法或靜態方法時應該根據是否該方法和實例化對象具有邏輯上的相關性如果是就應該使用實例化對象 反之使用靜態方法
我是把靜態類當做全局變量和全局函數的整合對象來用的
全局累加時用
不需要生成對象的
經常頻繁使用的
工具類裡的(如SqlHelper)
適當地使用static方法本身並沒有什麼當一個人從來不懂使用多態接口設計時很自然地會濫用static方法
個人理解在多個類中需要調用並且是與對象無關的方法可設為靜態方法方便調用
所有對象共有的方法
再不關系到任何於特定對象相關的操作
比如學生的年齡就是學生的相關
修改學生的年齡就不適合用靜態方法
一般來說如果你的方法裡沒有用到this關鍵字
那就適合用靜態方法
通常通用的類中一些常用的方法可以設計為靜態類
只要是沒有用到類的狀態信息只從參數獲取信息的都可以為靜態的
可以實現某些特殊的設計模式如Singleton
由於沒有this指針可以把某些系統API的回調函數以靜態函數的形式封裝到類的內部
可以封裝某些算法比如數學函數如lnsintan等等這些函數本就沒必要屬於任何一個對象所以從類上調用感覺更好
總之從OOA/OOD的角度考慮一切不需要實例化就可以有確定行為方式的函數都應該設計成靜態的
靜態方法與非靜態方法最明顯的區別就是如果某個方法是公共靜態的那麼可以直接通過類名方法名的方法來調用而公共實例方法則需要事先實例化對象然後才能調用
這些各種說法基本上都是正確的但是其中絕大多數是講了靜態和實例的區別以及靜態方法的特征
很少有說到何時或是為什麼要使用靜態的
靜態包括靜態類和靜態成員(靜態方法 和 靜態屬性)既然搜索出來的這些說的都是靜態成員(基本上說的都是靜態方法)那麼我也就先僅對靜態方法談一談自己的看法
上中學數學尤其是平面幾何的時候老師經常講定義與性質的區別性質只是它表現出來的特征而已而定義才是真正的決定性的東西
我覺得靜態方法的定義當然是 static 關鍵字了沒有用到this指針這一點才是靜態方法的首要性質(本質特征)像什麼【共通】【全局】【單例模式】呀那都是它的應用場景或是說使用靜態方法來達到的目的
那麼說到何時該使用靜態方法其實是困擾很多程序員的苦惱問題不明白這一點也從一個側面反映出對OO思想的理解不夠就很可能通過濫用靜態方法已達到在面向對象的語言中繼續進行面向過程的編程這是很可怕的
其實方法是否涉及具體類的實例或者簡單的說是否涉及數據(如果使用就要用到this指針)是決定是否使用靜態方法的根部要因然而判斷是否涉及到數據也是要看當前設計思路的有時候不夠OO的設計可能會將本該設計到數據的實例方法從數據相關變成數據無關(與OO不同面向過程的編程就是將 方法 與 數據 分開)在這樣的設計思路下你會發現怎麼什麼動作都是與數據無關的呢?恩這就該開始濫用靜態方法了
本想舉一個好一點的例子但是時間匆忙就簡短說一下 Log 吧有人認為寫日志是一個工具在干活應該是 Logdebug();
有人認為日志記錄器是個小精靈應該有血有肉 Log logger = new Log(); loggerdebug();
可能你會認為這要取決於Log類以及debug方法的復雜程度
也許你會認為這要看Log類中是否有數據比如輸出Level
也許還有其他理由
而我覺得可以說是仁者見仁智者見智也可以看做是不同的編程風格也可以 總之需要細細體會了
追加一個稍好一些的例子檢查 TextBox 是否輸入了數據如果沒有則依據某一個ID從配置文件中讀取一句話(錯誤信息)然後彈出並將此 TextBox 的底色置成紅色再將焦點放到上面去
如果你不希望這一系列的操作(大概行代碼)每次都要寫一遍你就會設法把它提煉為共通
方法一(靜態)
C#代碼
public class Checker
{
public static void CheckEmpty(TextBox textBox)
{
if (textBoxTextLength == )
{
string msg = PropertiesReadMessage();
MessageBoxShow(msg);
textBoxBackColor = ColorRead;
textBoxFocus();
}
}
}
CheckerCheckEmpty(textBox);
方法二(實例)
C#代碼
public class MyTextBox : TextBox
{
public void CheckEmpty()
{
if (thisTextLength == )
{
string msg = PropertiesReadMessage();
MessageBoxShow(msg);
thisBackColor = ColorRead;
thisFocus();
}
}
}
MyTextBox textBox = new MyTextBox();
textBoxCheckEmpty();
因為Swing使用的很少所以就用WinForm的控件來舉例子了所以代碼是C#的其實沒有關系所有OO語言在這一點上都是一樣的
如果你不覺得【擴展】SDK的控件有多麼恐怖或者應為其他原因已經對其擴展了那麼我更推薦使用實例方法(方法二)理由嗎對控件的檢查本來就是和控件自身(Text屬性)息息相關的是活生生的
(這裡不討論讀配置文件MessageBox 等操作是否違背開閉原則)
From:http://tw.wingwit.com/Article/program/ASP/201311/21666.html