1. 河豚號(hào) > 生活百科 >

static變量放哪里區(qū)域(static關(guān)鍵字基本概念和應(yīng)用)

首先,描述了static關(guān)鍵字去修飾java類、方法、變量、代碼塊的方法然后,從底層分析static關(guān)鍵字,接下來(lái),給出static的一些使用場(chǎng)景和案例最后,對(duì)static進(jìn)行一個(gè)總結(jié),包括和普通變量的區(qū)分。

OK,開(kāi)始今天的文章。

一、static關(guān)鍵字的基本用法

1、static關(guān)鍵字基本概念

我們可以一句話來(lái)概括:方便在沒(méi)有創(chuàng)建對(duì)象的情況下來(lái)進(jìn)行調(diào)用。

也就是說(shuō):被static關(guān)鍵字修飾的不需要?jiǎng)?chuàng)建對(duì)象去調(diào)用,直接根據(jù)類名就可以去訪問(wèn)。對(duì)于這個(gè)概念,下面根據(jù)static關(guān)鍵字的四個(gè)基本使用來(lái)描述。然后在下一部分再來(lái)去分析static的原理,希望你能認(rèn)真讀完。

2、static關(guān)鍵字修飾類

java里面static一般用來(lái)修飾成員變量或函數(shù)。但有一種特殊用法是用static修飾內(nèi)部類,普通類是不允許聲明為靜態(tài)的,只有內(nèi)部類才可以。下面看看如何使用。

 

深入分析java中的關(guān)鍵字static

 

如果沒(méi)有用static修飾InterClass,則只能new 一個(gè)外部類實(shí)例。再通過(guò)外部實(shí)例創(chuàng)建內(nèi)部類。

3、static關(guān)鍵字修飾方法

修飾方法的時(shí)候,其實(shí)跟類一樣,可以直接通過(guò)類名來(lái)進(jìn)行調(diào)用:

 

深入分析java中的關(guān)鍵字static

 

4、static關(guān)鍵字修飾變量

被static修飾的成員變量叫做靜態(tài)變量,也叫做類變量,說(shuō)明這個(gè)變量是屬于這個(gè)類的,而不是屬于是對(duì)象,沒(méi)有被static修飾的成員變量叫做實(shí)例變量,說(shuō)明這個(gè)變量是屬于某個(gè)具體的對(duì)象的。

我們同樣可以使用上面的方式進(jìn)行調(diào)用變量:

 

深入分析java中的關(guān)鍵字static

 

5、static關(guān)鍵字修飾代碼塊

靜態(tài)代碼塊在類第一次被載入時(shí)執(zhí)行,在這里主要是想驗(yàn)證一下,類初始化的順序。

父類靜態(tài)變量

父類靜態(tài)代碼塊

子類靜態(tài)變量

子類靜態(tài)代碼塊

父類普通變量

父類普通代碼塊

父類構(gòu)造函數(shù)

子類普通變量

子類普通代碼塊

子類構(gòu)造函數(shù)

代碼驗(yàn)證一下:

首先我們定義一個(gè)父類

 

深入分析java中的關(guān)鍵字static

 

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

 

深入分析java中的關(guān)鍵字static

 

看個(gè)結(jié)果

 

深入分析java中的關(guān)鍵字static

 

二、深入分析static關(guān)鍵字

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

 

深入分析java中的關(guān)鍵字static

 

從上圖我們可以發(fā)現(xiàn),靜態(tài)變量存放在方法區(qū)中,并且是被所有線程所共享的。這里要說(shuō)一下java堆,java堆存放的就是我們創(chuàng)建的一個(gè)個(gè)實(shí)例變量。

堆區(qū):

1、存儲(chǔ)的全部是對(duì)象,每個(gè)對(duì)象都包含一個(gè)與之對(duì)應(yīng)的class的信息。(class的目的是得到操作指令)

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

棧區(qū):

1.每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的對(duì)象和自定義對(duì)象的引用(不是對(duì)象),對(duì)象都存放在堆區(qū)中

2、每個(gè)棧中的數(shù)據(jù)(原始類型和對(duì)象引用)都是私有的,其他棧不能訪問(wèn)。

3、棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。、

方法區(qū):

1、又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。方法區(qū)包含所有的class和static變量。

2、方法區(qū)中包含的都是在整個(gè)程序中永遠(yuǎn)唯一的元素,如class,static變量。

下面通過(guò)一個(gè)案例說(shuō)明一下,從內(nèi)存的角度來(lái)看,static關(guān)鍵字為什么會(huì)有這樣的特性。

首先我們定義一個(gè)類

 

深入分析java中的關(guān)鍵字static

 

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

 

深入分析java中的關(guān)鍵字static

 

從上面可以看到,我們的方法在調(diào)用的時(shí)候,是從方法區(qū)調(diào)用的,但是堆內(nèi)存不一樣,堆內(nèi)存中的成員變量lastname是隨著對(duì)象的產(chǎn)生而產(chǎn)生。隨著對(duì)象的消失而消失。靜態(tài)變量是所有線程共享的,所以不會(huì)消失。這也就能解釋上面static關(guān)鍵字的真正原因。

下面對(duì)static關(guān)鍵字進(jìn)行一個(gè)小結(jié):

(1)特點(diǎn):

1、static是一個(gè)修飾符,用于修飾成員。(成員變量,成員函數(shù))static修飾的成員變量 稱之為靜態(tài)變量或類變量。

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

3、static優(yōu)先于對(duì)象存在,因?yàn)閟tatic的成員隨著類的加載就已經(jīng)存在。

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

5、static修飾的數(shù)據(jù)是共享數(shù)據(jù),對(duì)象中的存儲(chǔ)的是特有的數(shù)據(jù)。

(2)成員變量和靜態(tài)變量的區(qū)別:

1、生命周期的不同:

成員變量隨著對(duì)象的創(chuàng)建而存在隨著對(duì)象的回收而釋放。

靜態(tài)變量隨著類的加載而存在隨著類的消失而消失。

2、調(diào)用方式不同:

成員變量只能被對(duì)象調(diào)用。

靜態(tài)變量可以被對(duì)象調(diào)用,也可以用類名調(diào)用。(推薦用類名調(diào)用)

3、別名不同:

成員變量也稱為實(shí)例變量。

靜態(tài)變量稱為類變量。

4、數(shù)據(jù)存儲(chǔ)位置不同:

成員變量數(shù)據(jù)存儲(chǔ)在堆內(nèi)存的對(duì)象中,所以也叫對(duì)象的特有數(shù)據(jù)。

靜態(tài)變量數(shù)據(jù)存儲(chǔ)在方法區(qū)(共享數(shù)據(jù)區(qū))的靜態(tài)區(qū),所以也叫對(duì)象的共享數(shù)據(jù)。

(3)靜態(tài)使用時(shí)需要注意的事項(xiàng):

1、靜態(tài)方法只能訪問(wèn)靜態(tài)成員。(非靜態(tài)既可以訪問(wèn)靜態(tài),又可以訪問(wèn)非靜態(tài))

2、靜態(tài)方法中不可以使用this或者super關(guān)鍵字。

3、主函數(shù)是靜態(tài)的

好了,static關(guān)鍵字就介紹道這里

本文由網(wǎng)上采集發(fā)布,不代表我們立場(chǎng),轉(zhuǎn)載聯(lián)系作者并注明出處:http://www.webhosting0.com/shbk/37444.html

聯(lián)系我們

在線咨詢:點(diǎn)擊這里給我發(fā)消息

微信號(hào):15705946153

工作日:9:30-18:30,節(jié)假日休息