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_URL、NetManager.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;
}
沒有必要時請不用使用靜態變數,生命週期比較長,不能被回收,佔用記憶體。