當前位置:
首頁 > 知識 > static修飾的靜態變數與實例變數的區別,初始化內存運行機制詳解

static修飾的靜態變數與實例變數的區別,初始化內存運行機制詳解

1. 靜態變數的定義

靜態變數Static Variable)在計算機編程領域指在程序執行前系統就為之靜態分配(也即在運行時中不再改變分配情況)存儲空間的一類變數。

說明:靜態變數(用static修飾),它所被分配的空間是一直伴隨程序運行的,空間將會保持到程序的結束關閉,才會被釋放。

2.用static修飾的靜態變數與普通變數的區別

假若在定義一個類的過程中,定義了一個static修飾的變數,那麼這個類在被載入的同時,被static修飾的變數就存在於內存當中了,這樣一來就獨立於該類的所有對象,被該類所有對象共享,將對象相關的變成了類相關,基於此靜態變數也可以稱之為類變數。

代碼說明:


class Person

{

// 定義一個實例變數

public String name;

// 定義一個類變數

public static int eyeNum;

}

public class PersonTest

{

public static void main(String[] args)

{

Person p1 = new Person();

Person p2 = new Person();

p1.name = "王";

p2.name = "向";

p1.eyeNum = 2;

p2.eyeNum = 3;

System.out.println("p1變數的name變數值是:" + p1.name

+ " p1對象的eyeNum變數值是:" + p1.eyeNum);

System.out.println("p2變數的name變數值是:" + p2.name

+ " p2對象的eyeNum變數值是:" + p2.eyeNum);

}

}

運行結果:

static修飾的靜態變數與實例變數的區別,初始化內存運行機制詳解

分析:

在此程序中,我們將eyeNum定義為靜態變數(即類變數),而name定義為普通的實例變數。

當運行Person p1 = new Person()時,代碼第一次使用Person類,因此需要載入這個Person類,在類準備階段,系統將會為該類的類變數分配內存空間,並對其指定初始值。Person初始化完成後,系統將在對內存中為Person類分配一塊內存區域。

static修飾的靜態變數與實例變數的區別,初始化內存運行機制詳解

系統接著創建Person對象,並將Person對象賦值給p1變數,在此時,Person對象里會包含名為name的實例變數,並對其指定初始值。在此,可以看出eyeNum並不屬於Person對象,而是屬於Person類。

static修飾的靜態變數與實例變數的區別,初始化內存運行機制詳解

接著執行Person p2 = new Person(),代碼創建第二個Person對象,因為在第一次創建Person時,已經對Person進行了初始化,Person已經存在於對內存中了,因此,在此創建時,不需要再次進行初始化操作,創建過程同p1,在此不做示意圖解釋。

當執行該段代碼時


p1.name = "王";

p2.name = "向";

系統會向p1和p2所指向的實例變數分別賦值。


p1.eyeNum = 2;

p2.eyeNum = 3;

當執行到p1.eyeNum = 2 時,將2賦值給類變數eyeNum,當執行到p2.eyeNum = 3時,又將變數3賦值給eyeNum,由於eyeNum靜態變數對該類所有對象共享的,因此在執行p2.eyeNum = 3時,會將之前的eyeNum值進行覆蓋,因此,輸出p1.eyeNum和p2.eyeNum兩個值的時候,都會顯示最後的賦值結果3.

static修飾的靜態變數與實例變數的區別,初始化內存運行機制詳解

作者:小鵬_Leo

原文:https://www.cnblogs.com/Leo-Xia/p/10291180.html

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

谷歌是如何加強Kubernetes容器安全的?
MySql中exists和in的區別

TAG:程序員小新人學習 |