提起
final
變量,大家都是耳熟能詳,
- final成員變量表示常量枉疼,只能被賦值一次,賦值后值不再改變鞋拟。
- final類(lèi)不能被繼承骂维,沒(méi)有子類(lèi),final類(lèi)中的方法默認(rèn)是final的贺纲。
- final方法不能被子類(lèi)的方法覆蓋航闺,但可以被繼承。
- final不能用于修飾構(gòu)造方法
- final 常與 static一起用,作為常量來(lái)使用.
提問(wèn): 那么在一些方法的參數(shù)中定義為final是干嘛的?
答: 不希望這個(gè)變量在方法里面被修改,防止無(wú)意的修改而影響到調(diào)用方法外的變量
不知道這個(gè)答案是從哪個(gè)語(yǔ)言帶過(guò)來(lái)的, 感覺(jué)把final當(dāng)成const了.
假設(shè)出現(xiàn)以下方法定義:
void fuc(final String string);
void fuc1(String string);
對(duì)于這種寫(xiě)法,String本身就是一個(gè)不可以變的對(duì)象,并且其是作為基本參數(shù)類(lèi)型,傳參進(jìn)入后,方法里面改變了String的值外面也不會(huì)改變,因此這兩種寫(xiě)法實(shí)際結(jié)果是一樣.只不過(guò)加了final,在string被賦值時(shí)IDE會(huì)直接報(bào)紅.
void fuc(final A a);
void fuc(A a);
對(duì)于這種寫(xiě)法, A是一個(gè)對(duì)象,這樣寫(xiě)不是代表A里面內(nèi)容不能被改變,而是a不能被賦值為新對(duì)象了.
為什么使用匿名內(nèi)部類(lèi)的時(shí)候參數(shù)一定要加上final
讓我們寫(xiě)一個(gè)類(lèi)看一下
public class Test {
class Person {
String name;
int age;
}
private void func(final Person a) {
new Thread() {
@Override
public void run() {
super.run();
a.name = "hello";
}
}.start();
}
}
javac一下該文件,生成了3個(gè)class文件,我們看其中的兩個(gè)
內(nèi)部類(lèi)Person的class
class Test$Person {
String name;
int age;
Test$Person(Test var1) {
this.this$0 = var1;
}
}
匿名內(nèi)部類(lèi)Thread的class
class Test$1 extends Thread {
Test$1(Test var1, Person var2) {
this.this$0 = var1;
this.val$a = var2;
}
public void run() {
super.run();
this.val$a.name = "hello";
}
}
從這個(gè)匿名內(nèi)部類(lèi)的class文件我們可以看出兩點(diǎn)
- 其構(gòu)造參數(shù)中增加了一個(gè)調(diào)用類(lèi).即我們所說(shuō)的持有外部類(lèi)的引用.
- 我們定義的final參數(shù)被當(dāng)做構(gòu)造方法傳了進(jìn)來(lái).至于為什么要把這個(gè)參數(shù)當(dāng)做構(gòu)造函數(shù)參數(shù)傳進(jìn)來(lái),因?yàn)檎{(diào)用它的方法參數(shù)是存在棧里面的,其生命周期隨著這個(gè)方法的調(diào)用結(jié)束而結(jié)束.而我們的異步任務(wù)可不是,有可能會(huì)執(zhí)行很長(zhǎng)時(shí)間.
那么final的關(guān)鍵字作用就凸顯了,Person參數(shù)要拷貝到內(nèi)部類(lèi)中哮笆,而拷貝會(huì)帶來(lái)不一致性, func
中是一個(gè)異步的操作,負(fù)責(zé)改變a的name的值. 假設(shè)Person a 不是final的.那么a可以被任意指向新的對(duì)象,那么傳給這個(gè)異步任務(wù)的對(duì)象還是老對(duì)象,這就造成了不一致.因此Java需要強(qiáng)制約束對(duì)象的一致性.因此必須是final的.
本文作者:Anderson/Jerey_Jobs
博客地址 : http://jerey.cn/
簡(jiǎn)書(shū)地址 : Anderson大碼渣
github地址 : https://github.com/Jerey-Jobs