1. 程式人生 > >static的在記憶體中的存放位置

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區。所以不會報錯。