1. 程式人生 > >【static】---- 關鍵字在記憶體--圖解

【static】---- 關鍵字在記憶體--圖解

Static 關鍵字在記憶體中的圖解:

原始碼:

//寫一個人類

class Person

{

      private String name;
      private int age;
      static String country="CN";
      public Person(String name,int age)

      {

           this.name=name;

           this.age=age;

      }

     

      public void show()

      {

           System.out.println(Person.country+":"+this.name+":"+this.age);

      }

     

      public static void method()

      {

           System.out.println(Person.country);

      }

}

 

public class Static_Demo2

{

      public static void main(String[]args)

      {

           Person.method();

          

           Person p=new Person("java",32);

           p.show();

      }

}


記憶體分析:

1.在記憶體中劃分區域,棧的區域,堆的區域,方法區的區域。(如圖1)


2.方法都是存在方法區中的。當StaticDemo2被執行的時候,載入類,StaticDemo2類已經進記憶體了。

3.先在記憶體中劃分了一片空間,這個類叫做StaticDemo2(如圖2)。


這個類裡有一個成員方法,StaticDemo2(){}方法載入進來,是這個類中的預設建構函式(如圖3)。


4.接著載入靜態方法main,是在靜態方法區裡的,靜態區專門儲存靜態的資料,StaticDemo2類裡的靜態方法main就是儲存在這塊靜態區裡(如圖4)。


5.靜態區裡的方法和非靜態區裡的方法都是共享的。非靜態區裡的成員都有一個this,因為非靜態區的內容只能被物件呼叫;而到了靜態區裡它們都是所屬於類名,只能被類名呼叫。

6.這個時候主函式main進棧(如圖5)。


Main方法進棧以後開始執行裡面的內容(如圖6)。


7.接著執行第一句Person.method();這個是這個類才載入,這個它就開始找classpath路徑下有沒有Person.class檔案,如果沒有設定classpath,它就預設在當前路徑下找。找到以後就把Person.class檔案載入進記憶體,一載入就在方法區中分配空間了。Person類進記憶體了,緊接著person的建構函式(Person(Stringname,int age){this.name=name;this.age=age;})載入進來,voidshow(){sop();}也載入進來(如圖8),


在靜態方法區中static void method(){}也載入進來,staticString country也載入進來了(如圖9)。


8.載入完了之後,這個時候,執行第一句:Person.method();是用類名呼叫,用類名呼叫只能找靜態區。在靜態區找,在Person這個所屬類的靜態區中 ,有靜態方法method(),這個時候method方法開始進棧。開始執行method方法,如果有變數開闢棧空間,沒有變數直接執行。接著執行語句System.out.println(Person.country);在靜態方法區裡找Person類裡的變數country。執行完之後彈棧(如圖10)。


9.接著執行第二句:Person p=new Person(“java”,  20);,這個時候在主函式裡多了一個p(如圖12),


接著執行右邊new person(“java”,20);,new一個person在堆裡開闢一塊空間(如圖13)。


Person對像裡有變數name,age,,由於newperson(“java”,20)是呼叫了person類裡的構造方法,所以此時建構函式進棧(如圖14)。


進棧以後,person建構函式先有一個this,這this的值是堆裡物件的地址0x0056,接著將兩個引數“java”,“20”分別賦給person建構函式的區域性變數name,age(如圖15),

接著執行方法區裡的Person建構函式(如圖16),


this.name=name;,將區域性變數name的值“java”賦給了this所指向的物件的name。this同理。


10.建構函式person()初始化完了之後,它彈棧了,彈完棧了,右邊初始化完畢,這個時候將右邊的地址值賦給左邊的變數p,變數p指向了物件(如圖18)。


11.執行第三句:p.show();,方法區裡的show()進棧,show進棧,它是非靜態的,有所屬this,this有p的地址值(如圖19)。


接著執行輸出語句System.out.println(Person.country+name+age),,執行person.country,在靜態區裡呼叫country,打印出country的值。Name,通過this.name在物件裡呼叫,age,通過this.age在物件裡呼叫。輸出完以後show就彈棧了。最後的最後,主函式也彈棧了。所有程式結束(如圖20)。



相關推薦

static---- 關鍵字記憶體--圖解

Static 關鍵字在記憶體中的圖解: 原始碼: //寫一個人類 class Person { private String name; private int age;

java-static關鍵字用法-淺析

一、static關鍵字的作用   是一個修飾符,用於修飾成員(成員變數和成員方法); 二、static的特點   1.隨著類的載入而被載入;2.先於物件而存在;3被所有的物件所共享;4.可以直接被類名所呼叫。 1 public class Example1{ 2 public sta

static----static關鍵字--記憶體中簡單過程

Static關鍵字 靜態修飾符在記憶體中的簡單圖解過程 原始碼: //static靜態的測試 //寫一個Person()類 class Person { String name; static String country="China"; public

HTTP學習---圖解HTTP[三次握手&&ISO模型]

sts 建立 log user 圖解 header 進入 ica 過程 【轉】https://www.toutiao.com/i6592556686068679182/ 首先了解一次完整的HTTP請求到響應的過程需要的步驟: 1. 域名解析 2. 發起TCP的3次握手 3

C關鍵字void的用法

兩種 表示 數據 用法 fine 關鍵字 定義 是個 指針 void有兩種功能 【1】沒有 【2】任意類型 void出現的位置不同會有不同的解釋 【1】void func( void ) func左邊的void,代表『沒有返回值』 func右邊的括弧裏的void,代表此

轉載jvm記憶體回收

1.java的記憶體 java的記憶體結構分為 堆 (是gc的主要區域) 執行緒共享,主要是用於分配例項物件和陣列 棧 執行緒私有,它的生命週期和執行緒相同,又分成 虛擬機器棧和本地方法棧,只有它會報 StackOverFlowError,棧深度超標 方法區 執行緒共享 用於儲存被虛

Linux記憶體管理

摘要:本章首先以應用程式開發者的角度審視Linux的程序記憶體管理,在此基礎上逐步深入到核心中討論系統實體記憶體管理和核心記憶體的使用方法。力求從外到內、水到渠成地引導網友分析Linux的記憶體管理與使用。在本章最後,我們給出一個記憶體對映的例項,幫助網友們理解核心記憶體管理與使用者記憶體管理之間的

基礎計算機記憶體分配-堆-棧等概念的區別

說明 在資料結構範疇內,堆是一種排序的方式,棧是一種“先進後出”的資料結構。 在記憶體分配的範疇內,堆是一種儲存區間,該區間通過連結串列的方式進行組織;棧也是一種儲存區間,該區間的操作類似資料結構中棧的操作方式--“先進後出”。 記憶體分配 靜態儲存區 棧區

C++動態記憶體分配

如何動態新增資料,輸入長度不受限制? 陣列是不行的,它的長度為常量。有人就像將手動輸入一個長度,然後就有了如下程式碼: int n = 0; scanf("%d", &n); int Contact[n]; 編譯錯誤。我只能說你太年輕,陣列的長度是常量呀,你這分明是

C++關鍵字

asm else new this auto enum operator throw bool explicit private tr

JDK 記憶體引數含義

Eclipse崩潰,錯誤提示: MyEclipse has detected that less than 5% of the 64MB of Perm  Gen (Non-heap memory) space remains. It is strongly recommended tha

乾貨Linux記憶體資料的獲取與轉存 直搗密碼

知識源:Unit 2: Linux/Unix Acquisition 2.1 Linux/Unix Acquistion Memory Acquisition 中的實驗demo部分  小白注意,這是網路安全RITx: CYBER502x 部分的內容。 19年1月初,該系列課程會推出501x,這是面向

JAVA談談記憶體洩露

                                          &

MySQLInnoDB 記憶體管理機制 --- Buffer Pool

InnoDB Buffer Pool 是一塊連續的記憶體,用來儲存訪問過的資料頁面 innodb_buffer_pool_size 引數用來定義 innodb 的 buffer pool 的大小 是 MySQL 中擁有最大的記憶體的模組 Innodb 中,資料的訪問是按照頁/塊(預設為16

轉載Linux記憶體管理與相關概念

    在Linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統佔用了,表面感覺是記憶體不夠用了,其實不然。Linux記憶體管理的一個特點是無論實體記憶體有多大,Linux 都將其充分利用(The reason Linux uses so much mem

Linux記憶體管理(最透徹的一篇)

摘要:本章首先以應用程式開發者的角度審視Linux的程序記憶體管理,在此基礎上逐步深入到核心中討論系統實體記憶體管理和核心記憶體的使用方法。力求從外到內、水到渠成地引導網友分析Linux的記憶體管理與使用。在本章最後,我們給出一個記憶體對映的例項,幫助網友們理解核心記憶體管理

java記憶體洩漏的定位與分析

1、為什麼會發生記憶體洩漏 Java如何檢測內在洩漏呢?我們需要一些工具進行檢測,並發現記憶體洩漏問題,不然很容易發生down機問題。 編寫java程式最為方便的地方就是我們不需要管理記憶體的分配和釋放,一切由jvm來進行處理,當java物件不再被應用時,等到堆記憶體不夠

乾貨Windows記憶體獲取和分析---查詢惡意程序,埠

來源:Unit 5: Windows Acquisition 5.1 Windows Acquisition Windows Memory Acquisition and Analysis   調查人員檢查實體記憶體內容,以檢測惡意程序、威脅和記憶體駐留惡意軟體,以恢復密碼和獲取金鑰。 &nb

C++動態記憶體管理

一、C/C++記憶體分佈 我們先回顧在C語言學習階段學習過的一張記憶體分佈圖: 然後我們可以根據上邊的這幅圖,做一下下面這道筆試中一定會遇到的判斷儲存區的筆試題: int globalVar = 1

筆記ios 記憶體大小的限制 (因佔用記憶體太大而crash)

因ios對每個程式都有最大的記憶體分配限制,如果超過了這個閾值,會被系統強制關閉,造成crash,通常出現在bugly上的錯誤碼是 SEGV_ACCERR。在除錯的時候,會顯示類似這樣的資訊   EXC_RESOURCE RESOURCE_TYPE_MEMORY (lim