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

如果沒(méi)有用static修飾InterClass,則只能new 一個(gè)外部類(lèi)實(shí)例。再通過(guò)外部實(shí)例創(chuàng )建內部類(lèi)。
3、static關(guān)鍵字修飾方法
修飾方法的時(shí)候,其實(shí)跟類(lèi)一樣,可以直接通過(guò)類(lèi)名來(lái)進(jìn)行調用:

4、static關(guān)鍵字修飾變量
被static修飾的成員變量叫做靜態(tài)變量,也叫做類(lèi)變量,說(shuō)明這個(gè)變量是屬于這個(gè)類(lèi)的,而不是屬于是對象,沒(méi)有被static修飾的成員變量叫做實(shí)例變量,說(shuō)明這個(gè)變量是屬于某個(gè)具體的對象的。
我們同樣可以使用上面的方式進(jìn)行調用變量:

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

然后定義一個(gè)子類(lèi)

看個(gè)結果

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

從上圖我們可以發(fā)現,靜態(tài)變量存放在方法區中,并且是被所有線(xiàn)程所共享的。這里要說(shuō)一下java堆,java堆存放的就是我們創(chuàng )建的一個(gè)個(gè)實(shí)例變量。
堆區:
1、存儲的全部是對象,每個(gè)對象都包含一個(gè)與之對應的class的信息。(class的目的是得到操作指令)
2、jvm只有一個(gè)堆區(heap)被所有線(xiàn)程共享,堆中不存放基本類(lèi)型和對象引用,只存放對象本身
棧區:
1.每個(gè)線(xiàn)程包含一個(gè)棧區,棧中只保存基礎數據類(lèi)型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2、每個(gè)棧中的數據(原始類(lèi)型和對象引用)都是私有的,其他棧不能訪(fǎng)問(wèn)。
3、棧分為3個(gè)部分:基本類(lèi)型變量區、執行環(huán)境上下文、操作指令區(存放操作指令)。、
方法區:
1、又叫靜態(tài)區,跟堆一樣,被所有的線(xiàn)程共享。方法區包含所有的class和static變量。
2、方法區中包含的都是在整個(gè)程序中永遠唯一的元素,如class,static變量。
下面通過(guò)一個(gè)案例說(shuō)明一下,從內存的角度來(lái)看,static關(guān)鍵字為什么會(huì )有這樣的特性。
首先我們定義一個(gè)類(lèi)

接下來(lái)我們從內存的角度出發(fā),看看

從上面可以看到,我們的方法在調用的時(shí)候,是從方法區調用的,但是堆內存不一樣,堆內存中的成員變量lastname是隨著(zhù)對象的產(chǎn)生而產(chǎn)生。隨著(zhù)對象的消失而消失。靜態(tài)變量是所有線(xiàn)程共享的,所以不會(huì )消失。這也就能解釋上面static關(guān)鍵字的真正原因。
下面對static關(guān)鍵字進(jìn)行一個(gè)小結:
(1)特點(diǎn):
1、static是一個(gè)修飾符,用于修飾成員。(成員變量,成員函數)static修飾的成員變量 稱(chēng)之為靜態(tài)變量或類(lèi)變量。
2、static修飾的成員被所有的對象共享。
3、static優(yōu)先于對象存在,因為static的成員隨著(zhù)類(lèi)的加載就已經(jīng)存在。
4、static修飾的成員多了一種調用方式,可以直接被類(lèi)名所調用,(類(lèi)名.靜態(tài)成員)。
5、static修飾的數據是共享數據,對象中的存儲的是特有的數據。
(2)成員變量和靜態(tài)變量的區別:
1、生命周期的不同:
成員變量隨著(zhù)對象的創(chuàng )建而存在隨著(zhù)對象的回收而釋放。
靜態(tài)變量隨著(zhù)類(lèi)的加載而存在隨著(zhù)類(lèi)的消失而消失。
2、調用方式不同:
成員變量只能被對象調用。
靜態(tài)變量可以被對象調用,也可以用類(lèi)名調用。(推薦用類(lèi)名調用)
3、別名不同:
成員變量也稱(chēng)為實(shí)例變量。
靜態(tài)變量稱(chēng)為類(lèi)變量。
4、數據存儲位置不同:
成員變量數據存儲在堆內存的對象中,所以也叫對象的特有數據。
靜態(tài)變量數據存儲在方法區(共享數據區)的靜態(tài)區,所以也叫對象的共享數據。
(3)靜態(tài)使用時(shí)需要注意的事項:
1、靜態(tài)方法只能訪(fǎng)問(wèn)靜態(tài)成員。(非靜態(tài)既可以訪(fǎng)問(wèn)靜態(tài),又可以訪(fǎng)問(wèn)非靜態(tài))
2、靜態(tài)方法中不可以使用this或者super關(guān)鍵字。
3、主函數是靜態(tài)的
好了,static關(guān)鍵字就介紹道這里
本文由網(wǎng)上采集發(fā)布,不代表我們立場(chǎng),轉載聯(lián)系作者并注明出處:http://seensnowboarding.com/shbk/37444.html