首先,描述了static關鍵字去修飾java類、方法、變量、代碼塊的方法然后,從底層分析static關鍵字,接下來,給出static的一些使用場景和案例最后,對static進行一個總結,包括和普通變量的區分。
OK,開始今天的文章。
一、static關鍵字的基本用法
1、static關鍵字基本概念
我們可以一句話來概括:方便在沒有創建對象的情況下來進行調用。
也就是說:被static關鍵字修飾的不需要創建對象去調用,直接根據類名就可以去訪問。對于這個概念,下面根據static關鍵字的四個基本使用來描述。然后在下一部分再來去分析static的原理,希望你能認真讀完。
2、static關鍵字修飾類
java里面static一般用來修飾成員變量或函數。但有一種特殊用法是用static修飾內部類,普通類是不允許聲明為靜態的,只有內部類才可以。下面看看如何使用。

如果沒有用static修飾InterClass,則只能new 一個外部類實例。再通過外部實例創建內部類。
3、static關鍵字修飾方法
修飾方法的時候,其實跟類一樣,可以直接通過類名來進行調用:

4、static關鍵字修飾變量
被static修飾的成員變量叫做靜態變量,也叫做類變量,說明這個變量是屬于這個類的,而不是屬于是對象,沒有被static修飾的成員變量叫做實例變量,說明這個變量是屬于某個具體的對象的。
我們同樣可以使用上面的方式進行調用變量:

5、static關鍵字修飾代碼塊
靜態代碼塊在類第一次被載入時執行,在這里主要是想驗證一下,類初始化的順序。
父類靜態變量
父類靜態代碼塊
子類靜態變量
子類靜態代碼塊
父類普通變量
父類普通代碼塊
父類構造函數
子類普通變量
子類普通代碼塊
子類構造函數
代碼驗證一下:
首先我們定義一個父類

然后定義一個子類

看個結果

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

從上圖我們可以發現,靜態變量存放在方法區中,并且是被所有線程所共享的。這里要說一下java堆,java堆存放的就是我們創建的一個個實例變量。
堆區:
1、存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
2、jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身
棧區:
1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2、每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
3、棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。、
方法區:
1、又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。
2、方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。
下面通過一個案例說明一下,從內存的角度來看,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關鍵字就介紹道這里
本文由網上采集發布,不代表我們立場,轉載聯系作者并注明出處:http://www.seensnowboarding.com/shbk/37444.html