static關鍵字基本概念和應用「static變數放哪裡區域」

首先,描述了static關鍵字去修飾java類、方法、變數、代碼塊的方法然後,從底層分析static關鍵字,接下來,給出static的一些使用場景和案例最後,對static進行一個總結,包括和普通變數的區分。

OK,開始今天的文章。

一、static關鍵字的基本用法

1、static關鍵字基本概念

我們可以一句話來概括:方便在沒有創建對象的情況下來進行調用。

也就是說:被static關鍵字修飾的不需要創建對象去調用,直接根據類名就可以去訪問。對於這個概念,下面根據static關鍵字的四個基本使用來描述。然後在下一部分再來去分析static的原理,希望你能認真讀完。

2、static關鍵字修飾類

java裡面static一般用來修飾成員變數或函數。但有一種特殊用法是用static修飾內部類,普通類是不允許聲明為靜態的,只有內部類才可以。下面看看如何使用。

深入分析java中的關鍵字static

如果沒有用static修飾InterClass,則只能new 一個外部類實例。再通過外部實例創建內部類。

3、static關鍵字修飾方法

修飾方法的時候,其實跟類一樣,可以直接通過類名來進行調用:

深入分析java中的關鍵字static

4、static關鍵字修飾變數

被static修飾的成員變數叫做靜態變數,也叫做類變數,說明這個變數是屬於這個類的,而不是屬於是對象,沒有被static修飾的成員變數叫做實例變數,說明這個變數是屬於某個具體的對象的。

我們同樣可以使用上面的方式進行調用變數:

深入分析java中的關鍵字static

5、static關鍵字修飾代碼塊

靜態代碼塊在類第一次被載入時執行,在這裡主要是想驗證一下,類初始化的順序。

  • 父類靜態變數
  • 父類靜態代碼塊
  • 子類靜態變數
  • 子類靜態代碼塊
  • 父類普通變數
  • 父類普通代碼塊
  • 父類構造函數
  • 子類普通變數
  • 子類普通代碼塊
  • 子類構造函數

代碼驗證一下:

首先我們定義一個父類

深入分析java中的關鍵字static

然後定義一個子類

深入分析java中的關鍵字static

看個結果

深入分析java中的關鍵字static

二、深入分析static關鍵字

上面我們只是描述了一下static關鍵字的基本使用場景,下面主要解析一下static關鍵字的深層原理。要理解static為什麼會有上面的特性,首先我們還需要從jvm內存說起。我們先給出一張java的內存結構圖,然後通過案例描述一下static修飾的變數存放在哪?

深入分析java中的關鍵字static

從上圖我們可以發現,靜態變數存放在方法區中,並且是被所有線程所共享的。這裡要說一下java堆,java堆存放的就是我們創建的一個個實例變數。

堆區:

1、存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)

2、jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身

棧區:

1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中

2、每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。

3、棧分為3個部分:基本類型變數區、執行環境上下文、操作指令區(存放操作指令)。、

方法區:

1、又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變數。

2、方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變數。

下面通過一個案例說明一下,從內存的角度來看,static關鍵字為什麼會有這樣的特性。

首先我們定義一個類

深入分析java中的關鍵字static

接下來我們從內存的角度出發,看看

深入分析java中的關鍵字static

從上面可以看到,我們的方法在調用的時候,是從方法區調用的,但是堆內存不一樣,堆內存中的成員變數lastname是隨著對象的產生而產生。隨著對象的消失而消失。靜態變數是所有線程共享的,所以不會消失。這也就能解釋上面static關鍵字的真正原因。

下面對static關鍵字進行一個小結:

(1)特點:

1、static是一個修飾符,用於修飾成員。(成員變數,成員函數)static修飾的成員變數 稱之為靜態變數或類變數。

2、static修飾的成員被所有的對象共享。

3、static優先於對象存在,因為static的成員隨著類的載入就已經存在。

4、static修飾的成員多了一種調用方式,可以直接被類名所調用,(類名.靜態成員)。

5、static修飾的數據是共享數據,對象中的存儲的是特有的數據。

(2)成員變數和靜態變數的區別:

1、生命周期的不同:

成員變數隨著對象的創建而存在隨著對象的回收而釋放。

靜態變數隨著類的載入而存在隨著類的消失而消失。

2、調用方式不同:

成員變數只能被對象調用。

靜態變數可以被對象調用,也可以用類名調用。(推薦用類名調用)

3、別名不同:

成員變數也稱為實例變數。

靜態變數稱為類變數。

4、數據存儲位置不同:

成員變數數據存儲在堆內存的對象中,所以也叫對象的特有數據。

靜態變數數據存儲在方法區(共享數據區)的靜態區,所以也叫對象的共享數據。

(3)靜態使用時需要注意的事項:

1、靜態方法只能訪問靜態成員。(非靜態既可以訪問靜態,又可以訪問非靜態)

2、靜態方法中不可以使用this或者super關鍵字。

3、主函數是靜態的

好了,static關鍵字就介紹道這裡

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/298483.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-28 17:30
下一篇 2024-12-28 17:30

相關推薦

發表回復

登錄後才能評論