final可用于三種情況:數(shù)據(jù)比然,方法和類
final數(shù)據(jù)
-
final基本類型(編譯時(shí)常量)
可在編譯時(shí)執(zhí)行算式丈氓,減輕運(yùn)行時(shí)負(fù)擔(dān),必須是基本類型强法,定義此類常量時(shí)必須賦值万俗。private final int i = 10;
-
final引用類型
對于對象引用,final使引用恒定不變饮怯。但是引用本身卻是可以被修改的闰歪。public class Person{ private String name; ... public void setName(String name){ this.name = name; } ... public static void main(String [] args){ final Person person = new Person(); person.setName("memeda");//Person雖然是final的,但這里可以改變?nèi)说拿? } }
-
static final域
占據(jù)一段不能改變的存儲空間private static final int i = 10;
空白final
聲明為final但又未給定初始值的域蓖墅。但無論什么時(shí)候都必須保證final在使用前被初始化库倘。
public class Person{
private final int i;
{
i = 10;//在初始化塊初始化或者在所有的構(gòu)造函數(shù)內(nèi)都有初始化動作
}
}
final參數(shù)
final參數(shù)意味著無法在方法中改變參數(shù)引用所指向的對象:
public void func(final Person p){
//! p = new Person();//不合法,參數(shù)被指定為final的
}
final方法
- final方法無法被覆蓋论矾,子類無法修改final方法的實(shí)現(xiàn)
- 任何private方法都被隱式的指定為final的教翩,因?yàn)閜rivate方法子類無法覆蓋,即使子類創(chuàng)建了一個同名方法也沒有實(shí)現(xiàn)覆蓋贪壳,僅是生成了一個新的方法饱亿。
- static方法與final方法不屬于動態(tài)綁定(其他所有方法都是后期綁定的)。所以編譯器可以為final方法生成更有效的代碼,然而大多數(shù)情況下彪笼,這樣做對程序設(shè)計(jì)整體沒有多大改觀钻注,所以不要為了提高性能而使用final
final類
當(dāng)將某個類定義為final時(shí),就表明不打算繼承該類杰扫,該類不允許有子類队寇。final類中的方法都隱式的指定為final的,因?yàn)闊o法覆蓋它們章姓。