成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別
變數名首寫字母使用小寫,如果由多個單片語成,從第2個單詞開始的其他單詞的首寫字母使用大寫。
如果區域性變數的名字和成員變數的名字相同, 要想在該方法中使用成員變數,必須使用關鍵字this
成員變數和區域性變數的區別
成員變數:
1、成員變數定義在類中,在整個類中都可以被訪問。
2、成員變數隨著物件的建立而建立,隨著物件的消失而消失,存在於物件所在的堆記憶體中。
3、成員變數有預設初始化值。
區域性變數:
1、區域性變數只定義在區域性範圍內,如:函式內,語句內等,只在所屬的區域有效。
2、區域性變數存在於棧記憶體中,作用的範圍結束,變數空間會自動釋放。
3、區域性變數沒有預設初始化值
在使用變數時需要遵循的原則為:就近原則
首先在區域性範圍找,有就使用;接著在成員位置找。
成員變數(俗稱全域性變數,不區分static),又分為兩種
- 例項變數
- 類變數(static靜態變數)
通過一段程式碼我們便能區分 靜態變數(類變數),例項變數 和 區域性變數 三者的區別
- public class Demo {
- /**
- * 成員變數(俗稱全域性變數),//有預設值為0
- * 靜態變數(也稱類變數),帶static的
- * 例項變數,不帶static的
- * 區域性變數 //無預設值,需要初始化
- */
- static int x; //類變數,有預設值為0
- int y ;//示例變數
- public static void main(String args[]) {
- System.out.println(x);//訪問類變數,值=0
- int x=5;//區域性變數,必須初始化
- System.out.println(x);//訪問區域性變數,值=5
- Demo demo = new Demo();//建立例項
- System.out.println(demo.y);//通過例項訪問例項變數,值=0
- }
- }
其中成員變數(靜態變數+例項變數)是有預設值的,即預設值=0;而區域性變數沒有。
靜態變數
是一個修飾符,用於修飾成員(成員變數和成員函式)。
特點:
1、想要實現物件中的共性資料的物件共享。可以將這個資料進行靜態修飾。
2、被靜態修飾的成員,可以直接被類名所呼叫。也就是說,靜態的成員多了一種呼叫方式。類名.靜態方式。
3、靜態隨著類的載入而載入。而且優先於物件存在。
弊端:
1、有些資料是物件特有的資料,是不可以被靜態修飾的。因為那樣的話,特有資料會變成物件的共享資料。這樣對事物的描述就出了問題。所以,在定義靜態時,必須要明確,這個資料是否是被物件所共享的。
2、靜態方法只能訪問靜態成員,不可以訪問非靜態成員。
因為靜態方法載入時,優先於物件存在,所以沒有辦法訪問物件中的成員。
3、靜態方法中不能使用this,super關鍵字。
因為this代表物件,而靜態在時,有可能沒有物件,所以this無法使用。
什麼時候使用靜態變數?
在程式執行期間,類中的靜態變數其記憶體空間對所有該類的例項是共享的,因此在某些時候,為了節省記憶體空間開銷,共享資源, 我們可以將類中的變數宣告為靜態變數。
但是因為靜態變數生命週期太長,並且不易被系統回收,所有如果使用不合理,就會適得其反,從而造成大量記憶體的浪費。
因此建議在全部符合下列條件的情況下才使用靜態變數:
(1)變數所包含的物件體積較大,佔用記憶體較多
(2)變數所包含的物件生命週期較長
(3)變數所包含的物件資料穩定
(4)該類的例項 有 對該變數包含物件的共享需求
作用域問題
1. 類的靜態變數在記憶體中只有一個。靜態變數位於方法區,被類的所有例項共享。靜態變數的生命週期取決於類的生命週期(即類何時被載入和解除安裝)。
2. 類的每個例項都有相應的例項變數。例項變數位於堆區中。例項變數的生命週期取決於例項的生命週期(即例項何時被建立及銷燬)。
3. 假如成員變數(包括靜態變數和例項變數)是引用變數,那麼當該成員變數結束生命週期時,並不意味著它所引用的物件也一定結束生命週期。變數的生命週期
和物件的生命週期是兩個不同的概念。
4. 區域性變數位於棧區,其生命週期取決於所屬的方法何時被呼叫及結束呼叫。
總結一下:
區域性變數位於棧區,靜態變數位於方法區,例項變數位於堆區,方法的位元組碼位於方法區,物件本身位於堆區,物件的引用位於棧區。
順便配張圖
相關文章
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- Python中類變數、成員變數、區域性變數的區別Python變數
- 成員變數和區域性變數變數
- 區域性變數和全域性變數變數
- java 全域性變數和區域性變數Java變數
- jmeter全域性變數和區域性變數JMeter變數
- 全域性變數與區域性變數變數
- Java區域性變數與全域性變數Java變數
- 【c】全域性變數與區域性變數變數
- Python中的全域性變數和區域性變數Python變數
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- 類,物件,成員變數和區域性變數,匿名物件物件變數
- js-js的全域性變數和區域性變數JS變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- 【Java貓說】例項變數與區域性變數Java變數
- JavaScript五:全域性變數&區域性變數;運算子JavaScript變數
- 變數的分類(臨時(本地)變數、環境變數、全域性變數和系統變數)變數
- 類的靜態成員變數和普通成員變數該怎樣去區別定義變數
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式
- C語言--靜態區域性變數C語言變數
- 全域性變數變數
- 修改全域性變數時,可變型別和不可變型別的區別變數型別
- golang變數作用域問題-避免使用全域性變數Golang變數
- 函式之定義及全域性變數&區域性變數&風溼理論函式變數
- Spark 外部變數和BroadCast變數的區別Spark變數AST
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- 全域性 DOM 變數變數
- Python - 物件導向程式設計 - 類變數、例項變數/類屬性、例項屬性Python物件程式設計變數
- 區域性靜態變數的初始化觀測變數
- 簡述SHELL全域性環境變數與局變環境變數變數
- js宣告全域性變數JS變數
- 靜態變數變數
- 介面測試實戰--postman全域性變數和環境變數Postman變數
- 成員變數變數
- 全域性DOM變數的坑變數
- python變數與變數作用域Python變數
- Dll堆疊問題(Dll的靜態變數與全域性變數、vs的MT與MD)變數