一:static
1)修飾成員變量:
static關鍵字可以修飾成員變量,它所修飾的成員變量不屬於對象的數據結構,而是屬於類的變量,通常通過類名來引用static成員。
當創建對象后,成員變量是存儲在堆中的,而static成員變量和類的信息一起存儲在方法區, 而不是在堆中,
一個類的static成員變量只有“一份”(存儲在方法區),無論該類創建了多少對象。看如下的示例
public class StaticDemo {
public static void main(String[] args) {
People p1 = new People(18);
People p2 = new People(19);
People p3 = new People(20);
}
}
class People{
private int age;
private static int num;
public People(int age) {
this.age = age;
System.out.print(++num);
}
}
結果輸出123,因為num存在方法區只有一份!
2)static修飾方法:
static修飾的方法不需要針對某些對象進行操作,其運行結果僅僅與參數有關,調用的話直接用類名就可以調用了。因此static方法中不能對非static成員進行訪問,
static方法的作用在於提供一些工具方法(如Arrays.sort)和工廠方法(有興趣可以了解靜態工廠模式)等
3)static塊:
屬於類的代碼塊,在類加載期間執行並且只執行一次,可以用來加載靜態資源。(如圖片、音頻和視頻等文件)
二:final
1)final修飾變量:
final意為不可改變,修飾成員變量時可以在生命時初始化或者在構造函數中初始化,修飾局部變量時在使用之前初始化。要是企圖改變final修飾等變量值則會編譯錯誤!
2)final修飾方法:
final修飾等方法不能被重寫。
3)final修飾類:
final修飾等類不能被繼承,jdk中的一些基本類庫被定義成final,例如String,Math,Integer等,這樣可以防止對系統造成危害。
三:static final
static final修飾的成員變量被成為常量,必須聲明時初始化並且不可被改變,static final常量在編譯期間會被取代為其初始值。
