1. 河豚號 > 生活百科 >

static變量放哪里區(qū)域(static關鍵字基本概念和應用)

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

OK,開始今天的文章。

一、static關鍵字的基本用法

1、static關鍵字基本概念

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

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

2、static關鍵字修飾類

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

 

深入分析java中的關鍵字static

 

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

3、static關鍵字修飾方法

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

 

深入分析java中的關鍵字static

 

4、static關鍵字修飾變量

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

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

 

深入分析java中的關鍵字static

 

5、static關鍵字修飾代碼塊

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

父類靜態(tài)變量

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

子類靜態(tài)變量

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

父類普通變量

父類普通代碼塊

父類構造函數(shù)

子類普通變量

子類普通代碼塊

子類構造函數(shù)

代碼驗證一下:

首先我們定義一個父類

 

深入分析java中的關鍵字static

 

然后定義一個子類

 

深入分析java中的關鍵字static

 

看個結果

 

深入分析java中的關鍵字static

 

二、深入分析static關鍵字

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

 

深入分析java中的關鍵字static

 

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

堆區(qū):

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

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

棧區(qū):

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

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

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

方法區(qū):

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

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

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

首先我們定義一個類

 

深入分析java中的關鍵字static

 

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

 

深入分析java中的關鍵字static

 

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

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

(1)特點:

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

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

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

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

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

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

1、生命周期的不同:

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

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

2、調用方式不同:

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

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

3、別名不同:

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

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

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

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

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

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

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

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

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

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

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

聯(lián)系我們

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

微信號:15705946153

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