1.1 final的概念
繼承的出現(xiàn)提高了代碼的復(fù)用性,并方便開發(fā)。但隨之也有問題,有些類在描述完之后,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫??墒钱?dāng)子類繼承了這些特殊類之后,就可以對(duì)其中的方法進(jìn)行重寫,那怎么解決呢?
要解決上述的這些問題,需要使用到一個(gè)關(guān)鍵字final,final的意思為最終,不可變。final是個(gè)修飾符,它可以用來修飾類,類的成員,以及局部變量。
1.2 final的特點(diǎn)
? final修飾類不可以被繼承,但是可以繼承其他類。
class Yy {}
final class Fu extends Yy{} //可以繼承Yy類
class Zi extends Fu{} //不能繼承Fu類
? final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法,子類覆蓋后可以加final。
class Fu {
// final修飾的方法,不可以被覆蓋,但可以繼承使用
public final void method1(){}
public void method2(){}
}
class Zi extends Fu {
//重寫method2方法
public final void method2(){}
}
? final修飾的變量稱為常量,這些變量只能賦值一次。
final int i = 20;
i = 30; //賦值報(bào)錯(cuò),final修飾的變量只能賦值一次
? 引用類型的變量值為對(duì)象地址值,地址值不能更改,但是地址內(nèi)的對(duì)象屬性值可以修改。
final Person p = new Person();
Person p2 = new Person();
p = p2; //final修飾的變量p,所記錄的地址值不能改變
p.name = "小明";//可以更改p對(duì)象中name屬性值
p不能為別的對(duì)象,而p對(duì)象中的name或age屬性值可更改。
? 修飾成員變量,需要在創(chuàng)建對(duì)象前賦值,否則報(bào)錯(cuò)。(當(dāng)沒有顯式賦值時(shí),多個(gè)構(gòu)造方法的均需要為其賦值。)
class Demo {
//直接賦值
final int m = 100;
//final修飾的成員變量,需要在創(chuàng)建對(duì)象前賦值,否則報(bào)錯(cuò)。
final int n;
public Demo(){
//可以在創(chuàng)建對(duì)象時(shí)所調(diào)用的構(gòu)造方法中,為變量n賦值
n = 2016;
}
}