1. 程式人生 > >static與final關鍵字

static與final關鍵字

Java中,final關鍵字可以用來修飾類、方法和變數(包括成員變數和區域性變數)。

1、修飾類:  當用final修飾一個類時,表明這個類是最終類,不能被繼承。如果一個類你不想讓它被繼承,就可以用final進行修飾。

2、修飾方法:使用final修飾的方法不能被子類重寫。(最終方法)

3、修飾變數: 對於一個final變數,如果是基本資料型別的變數,則其數值一旦在初始化之後便不能更改;如果是引用型別的變數,則在對其初始化之後便不能再讓其指向另一個物件。

final修飾的變數,是常量,一旦初始化後,它的值不能被修改,即不能被重新賦值,主要是專案中應用的常量的抽取:比如URL常量、路徑常量、數字常量

.不能讓人輕易修改。

注意: final作用於類的成員變數時,成員變數(注意是類的成員變數,區域性變數只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變數一旦被初始化賦值之後,就不能再被賦值了。


 public static final String URL_GET = "/Api/GetMaintenanceType.html";//保養列表

————————————————————————————————>

Static關鍵字:  只能用於修飾成員變數和成員方法。

Static修飾的成員變數就成了類變數,隨著類的載入而載入,生命週期和類一樣

Static修飾的成員方法變成了類方法,可以直接通過類名呼叫。和.class一樣存在於方法區。

非靜態的成員方法與成員變數的呼叫,只能通過建立物件呼叫。類名.方法名等;而靜態的成員可以通過類名和建立物件呼叫(儘量用類名呼叫,不要建立物件)。

被修飾的成員有以下特點:

1)隨著類的載入而載入、

2)優先於物件存在、

3被所有物件所共享(比較節約空間)、(可以用程式碼證明)

4)可以直接被類名呼叫, Constant.BASE_URLNetManager.getData();

注意事項:

1)靜態方法只能訪問靜態的成員變數,不能訪問非靜態的成員變數。 為什麼?因為靜態成員先於物件存在,比物件先建立。當靜態成員存在時,物件還沒有建立。他們的生命週期不一樣。但是非靜態的可以訪問靜態的。

2)靜態方法中不可用this/super關鍵字。為什麼:this指向呼叫本方法的物件的引用(物件還沒有建立呢)

static修飾的成員變數、成員方法和類同時進行載入到記憶體,所以優先於物件存在。

一般在工具類中使用靜態、static

類是什麼時候載入到記憶體的?  物件是什麼時候載入到記憶體的?

記憶體分割槽圖:

堆記憶體:  用於儲存物件

棧記憶體:  用於儲存基本型別變數區,使用完成後,所佔空間會自動釋放。

方法區: 
1.又叫靜態區,跟堆一樣,被所有的執行緒共享。方法區包含所有的class和static變數。 
2.方法區中包含的都是在整個程式中永遠唯一的元素,如class,static變數。

靜態成員與非靜態成員的區別

生命週期:

靜態成員隨著類的載入而載入,隨著類的消失而消失,生命週期長;

普通成員隨著物件的存在而存在,隨著物件的消失而消失。

存放位置:靜態成員存在於方法區中,非靜態成員存在於堆中。

static對效能的影響:

為什麼說static塊可以用來優化程式效能,是因為它的特性:只會在類載入的時候執行一次

static final用來修飾成員變數和成員方法,可簡單理解為“全域性常量”!  常量必須要加static關鍵字修飾 

static就是靜態變數,宣告為static的變數實質上就是全域性變數,如果一個成員被宣告為static,它就能夠在它的類的任何物件建立之前被訪問,而不必引用任何物件


內部類 viewHolder需要加static,下面這種寫法影響效能
    class ViewHolder {
        TextView item_by_text1,item_by_text2;
    }
沒有必要時請不用使用靜態變數,生命週期比較長,不能被回收,佔用記憶體