final
- 修飾屬性、方法、類
- 修改屬性:值不能更改(常量)
- 修飾方法:方法不能重寫(繼承中子類不能重寫父類中被final修飾的成員方法)
- 修飾類:類不能被繼承
- 被final修飾的屬性:要不顯示賦值,要不構造方法賦值
//錯誤:final修飾的屬性/變量不能被修改 class Test { final int PI = 3.1415926; public Test(int pi){ this.PI = pi; } }
- 面試題:
- 構造方法能不能被final修飾?(不允許)
- final abstract能不能同時修飾一個類?(不能)
static
- 修飾:屬性、一般方法、遊離塊、內部類
- 面試題:能不能修飾外部類和局部變量?(不能)
- 修飾屬性:靜態屬性/類變量
- 修飾方法:靜態方法
- static修飾的成員變量不屬於對象的數據結構
- static成員變量和類的信息放在一起,僅保留一份,用於共享,而不是在堆中保留在每個對象裏的多個副本
- 被static修飾的屬性和方法可以用類名字直接調用,可以不創建對象。不過,對象也可以直接調用
- 靜態方法裏不能使用非靜態屬性。(eg:main函數不能直接使用本類中的非靜態的成員變量)
- static遊離塊在類加載的就被執行,且只執行一次
- 同時被final,static修飾的是常量,必須聲明的同時初始化,不可被改變(在編譯時就被指定具體值)
- static參與的程序執行次序
- 面試題
class Test { // Test example = new Test(); static Test example = new Test(); public Test() { System.out.println("lalala"); } public static void main(String[] args) { Test test = new Test(); } } // 不加static修飾,程序就存在遞歸