這里對final關鍵字進行總結。
final類
當類聲明為final時,就不能定義這個類的子類。因為final類的類無法定義子類,所以final類聲明的所有方法不會被覆蓋(override)。
final方法
若將實例方法聲明為final時,這個方法無法被子類所覆蓋(override)。
若將類方法(static方法)聲明為final時,這個方法無法被子類所隱藏(hide)。對隱藏這個術語不熟,本文最后會加上。
final字段(final屬性)
final字段的值只能指定一次。
final實例字段的值只能在定義時或者在構造器中指定。
如:
class A{
final int i = 1;
}
class A{
final int i;
public A(){
this.i = 2;
}
}
final類字段的值只能在定義是或者在static塊(靜態初始化塊)中指定。
class A{
static final int i = 12;
}
class A{
static final int i;
static{
i = 12;
}
}
final局部變量和final參數
final局部變量的值只能指定一次。
final參數的值在方法被調用時,由實參指定,不能再次指定(實際上也滿足被指定一次的原則)。
下面對java中類的繼承中的覆蓋(override)和隱藏(hide)進行總結。
在《Java核心技術卷一》中對隱藏是采用的訪問限定符(如public,private,protected)來實現的。這里的隱藏不是采用訪問限定符來實現的,而是采用子類和父類有同名的類方法和字段(實例字段和靜態字段)來實現的。在實際編程中,隱藏一般只用于類方法,即父類的類方法被子類中同名(這里的同名指方法名和參數都一樣,其實返回值也必須一樣,可以試一試)的類方法隱藏。
這里繼續總結一下:
- 子類可以覆蓋父類的實例方法(方法名、參數和返回值都一樣),另外,這里還有一個重載(overload)的概念,重載是一個靜態的概念,是在編譯時根據方法名和參數來確定的,重載是一個類自身的一個屬性,和繼承沒有關系。
- 子類可以隱藏父類的類方法(方法名、參數和返回值都一樣)
- 子類可以隱藏父類的字段(實例字段和靜態字段)(通過在子類中定義字段名相同(類型可和父類不一樣)的字段即可)。
覆蓋是動態的概念,是在運行時決定的。重載和隱藏是靜態的概念,是在編譯時決定的。
參考:
- 《Java多線程設計模式》中國鐵道出版社 2005
文章來源:
http://localhost/wp2/?p=61