final關鍵字代表“最終的”,“不可變的”
1.1 修飾變數
- 成員變數—代表當前變數是一個常量,存於方法區中。必須被顯式的初始化,即可以在定義時進行初始化,也可以在建構函式中進行初始化!
- 區域性變數-變數在整個作用域中不可變!
public void function(){ final int age = 0; //這個被final修飾的區域性變數只要在用之前進行初始化就好了,不用像成員變數一樣顯式的初始化 age ++; //報錯!!!final型別不可變! }
1.2 修飾方法
final修飾方法代表方法不可被子類重寫!!!private方法被隱式的指定為final!!!
1.3 修飾類
final修飾類代表類不能被繼承!!!
final的優點
- final關鍵字提高了效能。JVM和Java應用都會快取final變數。
- final變數可以安全的在多執行緒環境下進行共享,而不需要額外的同步開銷。比如String底層就是一個final型別的陣列,所以String型別是執行緒安全的!
- 使用final關鍵字,JVM會對方法、變數及類進行優化。
2.1 靜態導包
import static java.lang.Math.*
public class Test{
public static void main(String[] args){
int a = abs(-1); //可以直接省略[Math.]
}
}
2.2 修飾變數
與例項變數最大的區別在於static修飾的變數屬於類的,是類變數,而普通的成員變數則屬於例項的,與例項同生共死。畢竟類變數放在方法區中,例項變數與物件一起放在堆中!
2.3 修飾方法
與變數一樣,static修飾的方法屬於類的!
- 類方法隨著類的載入而載入,各個物件共享一份!而普通方法則隨著物件的建立載入
- 類方法只能呼叫外部類變數,而普通方法隨便都可以呼叫
- 類方法內部可使用的關鍵字有限,比如不能使用super和this!!而普通方法無所謂
2.4 修飾程式碼塊
修飾程式碼塊的時候,規則與修飾方法類似:在類的載入的時候載入一次,只能呼叫靜態變數,受限關鍵字
重點:當一段程式碼的執行涉及到父子類的靜態變數,靜態程式碼塊以及成員變數和普通程式碼塊的時候,他們的執行先後順序是怎樣的?
父類的靜態變數和靜態程式碼塊
子類的靜態變數和靜態程式碼塊
父類的例項變數和普通程式碼塊
父類的建構函式
子類的例項變數和普通程式碼塊
子類的建構函式
2.5 修飾內部類
內部類的一種,靜態內部類不依賴於外部類,而普通內部類其例項化必須依賴於外部類的例項化!!!
延申: 談談Java內部類
在 Java 中,可以將一個類定義在另一個類中或者一個方法中,這樣的類稱為內部類。廣泛意義上的內部類一般來說包括這四種:成員內部類、區域性內部類、匿名內部類和靜態內部類。
成員內部類
成員內部類是最普通的內部類,它的定義為位於另一個類的內部,形如下面的形式:class Circle { double radius = 0; public Circle(double radius) { this.radius = radius; } class Draw { //成員內部類 public void drawSahpe() { System.out.println("drawshape"); } } }
這樣看起來,類Draw像是類Circle的一個成員,Circle稱為外部類。成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員)。雖然成員內部類可以無條件地訪問外部類的成員,而外部類想訪問成員內部類的成員卻不是這麼隨心所欲了。在外部類中如果要訪問成員內部類的成員,必須先建立一個成員內部類的物件,再通過指向這個物件的引用來訪問
即成員內部類是依附外部類而存在的,也就是說,如果要建立成員內部類的物件,前提是必須存在一個外部類的物件。區域性內部類
區域性內部類是定義在一個方法或者一個作用域裡面的類,它和成員內部類的區別在於區域性內部類的訪問僅限於方法內或者該作用域內。class People{ public People() { } } class Man{ public Man(){ } public People getWoman(){ class Woman extends People{ //區域性內部類 int age =0; } return new Woman(); } }
注意: 區域性內部類就像是方法裡面的一個區域性變數一樣,是不能有 public、protected、private 以及 static 修飾符的。
匿名內部類
匿名內部類應該是平時我們編寫程式碼時用得最多的class Outer{ void show() { System.out.println("run in Outer"); } } public class Demo { public static void main(String args[]) { Outer ot=new Outer(){ void show() { System.out.println("run in Inner"); } }; ot.show();//run in Inner } }
本質:其實是繼承該類或者實現介面的子類匿名物件
- 匿名內部類是區域性內部類的更深入一步。
- 假如只建立某類的一個物件時,就不必將該類進行命名。
- 匿名內部類的前提是存在一個類或者介面,且匿名內部類是寫在方法中的。
- 只針對重寫一個方法時使用,需要重寫多個方法時不建議使用
靜態內部類
靜態內部類是不需要依賴於外部類的,這點和類的靜態成員屬性有點類似,並且它不能使用外部類的非static成員變數或者方法
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner(); //不需要外部類的例項!!!即不依賴於外部類
}
}
class Outter {
public Outter() {
}
static class Inner { //只能訪問外部類的靜態成員和方法哦!!!
public Inner() {
}
}
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結