什麼是靜態方法靜態方法的弊端

  若類的方法前加了static關鍵字,則該方法稱為靜態方法,那麼你對靜態方法瞭解多少呢?以下是由小編整理關於什麼是靜態方法的內容,希望大家喜歡!

  靜態方法的介紹

  靜態方法為類所有,可以通過物件來使用,也可以通過類來使用。但一般提倡通過類名來使用,因為靜態方法只要定義了類,不必建立類的例項就可使用。靜態方法只能用類的靜態成員。

  靜態方法的方法使用

  靜態方法與靜態變數一樣,屬於類本身,而不屬於那個類的一個物件。呼叫一個被定義為static的方法,可以通過在它前面加上這個類的名稱,也可以像呼叫非靜態方法一樣通過類物件呼叫。

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

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

  方法宣告

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

  <訪問修飾符>static返回型別 方法名***引數列表***

  {//方法體}

  方法呼叫

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

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

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

  ***2*** 通過類名直接呼叫

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

  方法規則

  我們在使用時要注意:

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

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

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

  程式碼示例

  #include<iostream>

  using namespace std;

  class CStaticTest{

  public:

  CStaticTest***int a***

  {

  this->a = a;

  }

  ~CStaticTest******{}

  static int add***CStaticTest& c1, CStaticTest& c2***

  {

  return c1.a + c2.a;

  }

  private:

  int a;

  };

  int main******

  {

  CStaticTest tmp1***1***;

  CStaticTest tmp2***2***;

  int sum1 = tmp1.add***tmp1, tmp2***;

  int sum2 = CStaticTest::add***tmp1, tmp2***;

  cout << sum1 << endl;

  cout << sum2 << endl;

  return 0;

  }

  實際應用

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

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

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

  靜態方法的經典案例

  ***1***用於對靜態欄位、只讀欄位等的初始化。

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

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

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

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

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

  以下用例子程式碼進一步說明:

  using System;

  class A { public static int X; static A******

  ④ 執行完後返回到③ { X = B.Y + 1; Console.WriteLine***"static A******"***; } }class B { public static int Y = A.X + 1③ 呼叫了A的靜態成員, 轉到A的靜態建構函式----> static B******

  ② 如果帶有初始值設定項的靜態欄位,執行該類的靜態建構函式時,

  先要按照文字順序執行那些初始值設定項。

  轉到初始值設定項----> { Console.WriteLine***"staticB******"***; } static void Main******

  ① 程式***,

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

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

  轉到B的靜態建構函式----> { Console.WriteLine***"X = {0},Y = {1}", A.X, B.Y***;

  ⑤ 輸出結果 Console.ReadLine******; } }

  靜態方法的弊端

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

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

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

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

靜態方法的弊端