static關鍵字的作用

2021-07-31 20:54:03 字數 2858 閱讀 6807

static是乙個修飾符,用於修飾成員(成員變數和成員函式):

1.當static修飾成員變數:

static修飾成員變數是解決資料的共享問題,static修飾的資料是每個物件共享 的資料。如果所有物件中某乙個屬性的值是一樣的,那麼在記憶體中會造成大量的資料重複,所以我們可以把這個重複的資料拿出來,放在乙個公共的地方,就用static修飾,如圖:

這個公共的地方不在堆裡也不在棧裡,在方法區的靜態區里,靜態區中放一些靜態變數和靜態方法。而被靜態修飾的變數和方法了一種呼叫方式:用類名呼叫。那麼靜態變數於成員變數的區別是什麼呢?

首先明確一點,類型別變數與類變數不是一碼事:類型別變數是由類定義的變數,類變數就是靜態變數。

(1)    兩個變數的生命週期不同。(也是靜態的弊端,生命週期太長,但是也好過占用記憶體)

成員變數隨著物件的建立而存在,隨著物件的**而被釋放;

(2)   呼叫方式不同。

成員變數只能被物件呼叫;

靜態變數可以被物件呼叫,還可以被類名呼叫。(不管有沒有物件,都建議用類名呼叫,因為這是靜態的專屬呼叫方式,可閱讀性強,讓人看了一目了然,知道這是靜態變數)。

(3)    別名不同。

成員變數也稱為例項變數;

靜態變數也稱為類變數。

(4)  資料儲存位置不同。

成員變數資料儲存在堆記憶體的物件中,所以也叫物件的特有資料;

靜態變數資料儲存在方法區(也叫共享區,資料區·····翻譯的名字多著呢,還記得之前五個區不?)的靜態區中,所以也叫物件的共享資料。(方法存在方法區,呼叫時進棧)

2.當static修飾成員函式:

當static修飾成員函式,這個函式就成為了乙個靜態函式,靜態函式可以直接訪問靜態成員,靜態方法,但是如果要訪問成員方法,只能通過物件訪問。我們來解釋一下這句話的意思。剛剛我們提到,靜態變數和靜態方法都是存放在靜態區中的,會隨著類的載入而載入,也就是說靜態成員的出現比物件要早,所以如果靜態函式要呼叫非靜態方法,我們必須要在靜態函式內部建立乙個物件.,以保證這個物件是和靜態方法一起出現的,這樣才能使用這個物件訪問非靜態的方法和變數。

1.      靜態方法只能訪問靜態成員(包含成員變數成員函式),非靜態既可以訪問靜態又可以訪問非靜態。

2.      靜態方法中不可以定義this過super關鍵字。(因為用類名呼叫靜態方法時沒有物件,所以this沒有指向,所以寫this是會報錯的 )

三句話**static在記憶體中的姿勢:

首先我們先來分析這段**:

當我們執行staticdemo2的位元組碼檔案的時候,這個類被載入進記憶體,然後進行空間的開闢,不同種類資料存放在不一樣的地方。方法區里有乙個靜態區,存放靜態方法和資料,非靜態區里存放非靜態的方法和資料,它們都是被共享的。非靜態區裡面都有乙個this所屬,內容只能被物件呼叫;靜態區里有乙個所屬是自己的類名,沒有this,this是不能寫在靜態方法裡的,所以此時,當我們呼叫這個staticdemo2類的時候,記憶體的載入如下:

當執行到主函式的時候,主函式進棧:

第一句話:使用到了person類,此時找classpath路徑下是否有person.class檔案,如果沒有設定classpath,預設在當前路徑下找,找到person檔案後載入person類,載入完畢後,執行method()方法,method()方法進棧,語句執行完畢,執行預設的return語句,方法出棧。

第二句話:在主函式中定義乙個person型別的變數p,在堆中建立乙個新物件,為物件分配位址,堆記憶體對物件進行資料初始化,然後傳引數進行建構函式初始化,建構函式進棧,執行完畢彈棧。

第三句話:p.show()在編譯執行之前都要檢查是否有show()方法,如果有show()方法,show()方法進棧,並且show()方法是非靜態的方法,所以show()方法裡也應該有預設的this引用,此時this的值是所屬的函式的呼叫物件的值,在輸出語句中可以通過類的所屬找到country,通過this找到name和age。執行完畢後結束函式。

什麼時候使用靜態?

靜態只能修飾成員(成員變數,成員函式)

1. 靜態變數;

不加靜態是在物件裡,加了靜態是在方法區里;

不加靜態是物件特有,加了靜態物件共有。

當分析物件中所具備的成員變數的值都是相同的,這個成員就可以被靜態修飾,但是如果有乙個值不是相同的或者可以被改變,那就不可以用靜態。

只要資料在物件中都是不同的,就是物件的特有資料,必須儲存在物件中,是非靜態的;

如果是相同的資料,物件不需要做修改,只需要使用即可,不需要儲存在物件中。(如存在物件中也可以,但是會造成空間的浪費,但是也不可以都用靜態,這樣問題分析不好,生命週期過長)。

2. 靜態函式;

函式是對外提供的功能,但是函式是否用靜態修飾就參考一點,這個函式是否訪問到物件的特有資料。

簡單點說,從源**看,該功能是否需要訪問非靜態的成員變數,如果需要,該功能就是非靜態的。如果不需要,就可以將該功能定義成靜態的,當然也可以定義成非靜態,但是非靜態需要被物件呼叫,而僅建立物件呼叫非靜態的方法,沒有訪問特有資料,該物件的建立是沒有意義的。

static關鍵字的作用

static關鍵字是c,c 中都存在的關鍵字,它主要有三種使用方式,其中前兩種在c c 語言中使用,第三種只在c 中使用 c,c 中具體細微操作不盡相同,本文以c 為準 1 區域性靜態變數 2 外部靜態變數 函式 3 靜態資料成員 成員函式 下面就這三種使用方式及注意事項分別說明 一 區域性靜態變數...

關鍵字static的作用

關鍵字static的作用是什麼?這個簡單的問題很少有人能回答完全。在c語言中,關鍵字static有三個明顯的作用 1在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。2 在模組內 但在函式體外 乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地...

關鍵字Static的作用

1 修飾變數 區域性靜態變數和全域性靜態變數,都存在記憶體的靜態區 區域性靜態變數,在函式體內定義,只能在函式內部使用,同乙個檔案中的其他函式不能用。即使函式執行結束,這個靜態變數的值也不會被銷毀,函式下次使用時仍能用到這個值。全域性靜態變數,在函式外部定義,作用域 從定義處開始,到所在檔案結尾處結...