final 匿名內部類等
簡述final作用
final:最終的
修飾類:不可被繼承
修飾方法:表示方法不可被子類覆蓋,但是可以過載
修飾變數:表示變數一旦賦值就不可以更改它的值
1修飾成員變數
如果修飾的是類變數,只能在靜態初始化塊中指定初始值或者生命該類變數時指定初始值
如果final修飾的時成員變數,可以在非靜態初始化塊、宣告變數時或者構造器中執行初始值
即final int b=0;
或{
b=0;
}
static{
b=0;
}
系統不會為區域性變數進行初始化,區域性變數必須由程式設計師進行顯示初始化,因此使用final修飾區域性變數時,即可以在定義時指定預設值,也可以不指定預設值,而在後面的程式碼中對final變數賦初值(僅一次)
3修飾基本型別和引用型別資料
如果是基本資料型別的變數,則其數值一旦在初始化之後便不能更改
如果是引用型別的變數,則在其初始化之後便不能再讓其指向另一個物件
即如果是引用型別變數可以對裡面屬性進行修改而不能改變它指向的地址
為什麼區域性內部類和匿名內部類只能訪問區域性final變數?
因為外面的方法執行完了 而裡面的沒有執行
內部類和外部類是同一個級別的,內部類不會因為定義在方法中就會隨著方法的執行完畢就被銷燬
這裡產生問題,當外部類方法結束時,區域性變數就會被銷燬了,但是內部類物件可能還存在,這裡就出現了一個矛盾:內部類物件訪問了一個不存在的變數。為了解決這個問題,jvm就將區域性變數複製了一份作為內部類的成員變數,這樣當局部變數死亡後,內部類仍可以訪問它,實際訪問的是區域性變數的copy
將區域性變數複製為內部類成員變數時,怎樣保證兩個變數是一樣的,就將區域性變數設定為final,對它初始化後,我就不讓你再去修改這個變數,就保證了內部類的成員變數和方法的區域性變數的一致性,實際也是一種妥協,使得區域性變數與內部類內建立的拷貝保持一致
匿名內部類是建立某個型別子類物件的快捷方式
格式 new 父類或介面(){
//進行方法重寫
}
已經存在的父類
public abstract class Person(){
public abstract void eat();
}
定義並建立 該父類的子類物件,並用多型的方式賦值給父類引用
Person p=new Person(){
public void eat(){
System.out.println('我吃了');
}
}.eat();//可直接呼叫eat方法
使用匿名物件的方式,將定義子類與建立子類物件兩個步驟由一個格式一次完成,。雖然是兩個步驟,但是兩個步驟是連在一起完成的。