物件導向過程接觸的重要關鍵字:extends super this final static
extends 關鍵字用作繼承功能,可以申明一個類是從另外一個類繼承而來的,一般形式如下:
class 子類 extends 父類 { }
繼承是java物件導向程式設計技術的一塊基石,因為它允許建立分等級層次的類。所有的類都是繼承於 java.lang.Object,當一個類沒有繼承的兩個關鍵字,則預設繼承object(這個類在 java.lang 包中,所以不需要 import)祖先類。
繼承就是子類繼承父類的特徵和行為,使得子類物件(例項)具有父類的例項域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
-
子類擁有父類非private的屬性,方法。
-
子類可以擁有自己的屬性和方法,即子類可以對父類進行擴充套件。
-
子類可以用自己的方式實現父類的方法。
-
Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關係就是C類是B類的父類,B類是A類的父類,這是java繼承區別於C++繼承的一個特性。
-
提高了類之間的耦合性(繼承的缺點,耦合度高就會造成程式碼之間的聯絡)。
super 與 this 關鍵字
super關鍵字:我們可以通過super關鍵字來實現對父類成員的訪問,用來引用當前物件的父類。
this關鍵字:指向自己的引用。
super 可以用在子類中,通過點號(.)來獲取父類的成員變數和方法。super 也可以用在子類的子類中,Java 能自動向上層類追溯。父類行為被呼叫,就好象該行為是本類的行為一樣,而且呼叫行為不必發生在父類中,它能自動向上層類追溯。
super 關鍵字的功能:
- 呼叫父類中宣告為 private 的變數。
- 點取已經覆蓋了的方法。
- 作為方法名錶示父類構造方法。
無論是 super() 還是 this(),都必須放在構造方法的第一行。
值得注意的是:
- 在構造方法中呼叫另一個構造方法,呼叫動作必須置於最起始的位置。
- 不能在構造方法以外的任何方法內呼叫構造方法。
- 在一個構造方法內只能呼叫一個構造方法。
如果編寫一個構造方法,既沒有呼叫 super() 也沒有呼叫 this(),編譯器會自動插入一個呼叫到父類構造方法中,而且不帶引數。
最後注意 super 與 this 的區別:super 不是一個物件的引用,不能將 super 賦值給另一個物件變數,它只是一個指示編譯器呼叫父類方法的特殊關鍵字。
static 的記憶體分配
靜態變數屬於類,不屬於任何獨立的物件,所以無需建立類的例項就可以訪問靜態變數。之所以會產生這樣的結果,是因為編譯器只為整個類建立了一個靜態變數的副本,也就是隻分配一個記憶體空間,雖然有多個例項,但這些例項共享該記憶體。例項變數則不同,每建立一個物件,都會分配一次記憶體空間,不同變數的記憶體相互獨立,互不影響,改變 a 物件的例項變數不會影響 b 物件。
注意:靜態變數雖然也可以通過物件來訪問,但是不被提倡,編譯器也會產生警告。static 的變數是在類裝載的時候就會被初始化。也就是說,只要類被裝載,不管你是否使用了這個static 變數,它都會被初始化。類變數(class variables)用關鍵字 static 修飾,在類載入的時候,分配類變數的記憶體,以後再生成類的例項物件時,將共享這塊記憶體(類變數),任何一個物件對類變數的修改,都會影響其它物件。
靜態方法
靜態方法是一種不能向物件實施操作的方法。例如,Math 類的 pow() 方法就是一個靜態方法,語法為 Math.pow(x, a),用來計算 x 的 a 次冪,在使用時無需建立任何 Math 物件。因為靜態方法不能操作物件,所以不能在靜態方法中訪問例項變數,只能訪問自身類的靜態變數。
以下情形可以使用靜態方法:
- 一個方法不需要訪問物件狀態,其所需引數都是通過顯式引數提供(例如 Math.pow())。
- 一個方法只需要訪問類的靜態變數。
main() 也是一個靜態方法,不對任何物件進行操作。實際上,在程式啟動時還沒有任何物件,main() 方法是程式的入口,將被執行並建立程式所需的物件。
關於靜態變數和靜態方法的總結:
-
- 一個類的靜態方法只能訪問靜態變數;
- 一個類的靜態方法不能夠直接呼叫非靜態方法;
- 如訪問控制許可權允許,靜態變數和靜態方法也可以通過物件來訪問,但是不被推薦;
- 靜態方法中不存在當前物件,因而不能使用 this,當然也不能使用 super;
- 靜態方法不能被非靜態方法覆蓋;
- 構造方法不允許宣告為 static 的;
- 區域性變數不能使用static修飾。
final關鍵字
final 關鍵字宣告類可以把類定義為不能繼承的,即最終類;或者用於修飾方法,該方法不能被子類重寫:
宣告類: final class 類名 {//類體}
宣告方法:修飾符(public/private/default/protected) final 返回值型別 方法名(){//方法體}
注:例項變數也可以被定義為 final,被定義為 final 的變數不能被修改。被宣告為 final 類的方法自動地宣告為 final,但是例項變數並不是 final
在 Java 中,宣告類、變數和方法時,可使用關鍵字 final 來修飾。final 所修飾的資料具有“終態”的特徵,表示“最終的”意思。具體規定如下:
- final 修飾的類不能被繼承。
- final 修飾的方法不能被子類重寫。
- final 修飾的變數(成員變數或區域性變數)即成為常量,只能賦值一次。
- final 修飾的成員變數必須在宣告的同時賦值,如果在宣告的時候沒有賦值,那麼只有 一次賦值的機會,而且只能在構造方法中顯式賦值,然後才能使用。
- final 修飾的區域性變數可以只宣告不賦值,然後再進行一次性的賦值。
final 一般用於修飾那些通用性的功能、實現方式或取值不能隨意被改變的資料,以避免被誤用,例如實現數學三角方法、冪運算等功能的方法,以及數學常量π=3.141593、e=2.71828 等。
事實上,為確保終態性,提供了上述方法和常量的 java.lang.Math 類也已被定義為final 的。如果變數被標記為 final,其結果是使它成為常數。注意:想改變 final 變數的值會導致一個編譯錯誤。