static的在記憶體中的存放位置
JVM記憶體總體一共分為了 4個部分:
stack segment、
heap segment、
code segment、
data segment)
stack segment(棧):
區域性變數:如main函式中宣告的str變數。如圖中,str,t存在於stack區:
棧中儲存基本資料型別的變數和自定義的物件的引用(不是物件),物件本身都存放在堆區中,被執行的方法的也是pull到棧中,當方法執行完後再push出棧。
heap segment(堆)
當new 一個物件的時候,此物件放在了heap segment(堆)當中。t存放在stack中,而new Test()這個實實在在的物件是存在了heap中
如。程式碼:
heap中儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令)
code segment(程式碼區)
類中方法的話,是存在在 code segment(程式碼區)中了
data segment(資料區)
static 的變數或者字串常量存在資料區
static變數與非static變數
static的變數與非static變數存放位置不一樣,並且變數的訪問許可權也不一樣。
static變數是全域性的,是類的所有物件都能訪問的,是所有方法都可以訪問的,無論是static修飾的方法還是非static方法都可以訪問,沒有限制。
而非static變數是私有的,是有訪問限制的,就是說是每個物件獨有的特有的,並且只有非static方法才可以訪問。
如圖:
static方法只能訪問static的變數,沒有許可權訪問非static變數。
static方法中宣告的變數可以與非static變數並且是類的屬性重名
方法中宣告的變數可以與非static變數並且是類的屬性重名
這是由於類的屬性是存在與物件中的,是在heap中,而方法中的變數是存在與code 區中的,在不同的區中可以重名。
非static方法中可以方訪問static變數。
這時因為static變數是共享的,任何方法,任何物件都可以訪問
static方法可以訪問static屬性
static方法中宣告的變數name存在code區,而類的屬性中的name存在物件中,而物件存在於heap區。所以不會報錯。