Java物件導向重要關鍵字

忘塵天外天發表於2017-07-18

物件導向過程接觸的重要關鍵字: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 變數的值會導致一個編譯錯誤。

 

相關文章