7.JAVA-類繼承、覆寫、final關鍵字


1.JAVA繼承-extends

在java中,要想實現繼承則使用extends關鍵字.

一般子類被稱為派生類,父類稱為基類(super)

extends需要注意的地方:

  • java不允許多重繼承(一個類只能繼承一個父類,不能繼承多個父類)
  • 派生類會繼承基類所有屬性和方法,但不能直接訪問基類的private私有屬性
  • 實例化派生類時,會先去調用父類的構造方法構造基類,再實例化自身的屬性類對象,最后才是調用自身類構造方法.
  • 在派生類中,有個隱藏的super,表示為基類,所以我們可以通過它指定如何構造基類

 

1.1 示例1-super使用

注意:super必須放在構造方法首行使用,如果用戶不使用super,則編譯器默認調用super()來初始化父類

代碼如下:

class Parent
{
         public Parent()
         {
                  System.out.println("Parent()");
         }
         public Parent(String str)
         {
                  System.out.println("Parent(String str):"+str);
         }
}

class Derived extends Parent
{
         public Derived()
         {
                  super("123");           //調用Parent(String str)初始化父類
                  System.out.println("Derived()");
         }
}

public class Test{
                  public static void main(String args[]){
                  Derived d = new Derived();
         }       
}

打印如下:

 

 

2.JAVA繼承之方法覆寫

當派生類覆寫基類的方法時候,要遵守方法的權限,返回值以及參數都一致.

如果派生類覆寫的基類方法是private的,則不能實現覆寫功能,因為基類的private方法是不可見的(參考2.2示例)

派生類覆寫方法,一般用於基類的方法不滿足當前派生類功能實現時,才會去覆寫.

2.1 示例1-覆寫

代碼如下:

class Parent
{
         public void func(int i)
         {
                  System.out.println("Parent::func()");
         }
}

class Derived extends Parent
{
         public void func(int i)              //覆寫父類的func方法
         {
                  System.out.println("Derived::func()");
         }
}

public class Test{
                  public static void main(String args[]){
                  Derived d = new Derived();
                  d.func(1);
         }       
}

2.2示例2-派生類private無法實現覆寫

先來個正常覆寫的代碼:

class Parent
{
         public void func()
         {
                  System.out.println("Parent::func()");
         }
         public void print()
         {
                  func();
         }
}

class Derived extends Parent
{
         public void func()            //覆寫父類的func方法
         {
                  System.out.println("Derived::func()");
         }
}

public class Test{
                  public static void main(String args[]){

                  Derived d = new Derived();
                  d.print();
         }       

}

 如下圖所示,打印派生類的func():

 

然后將Parent的func()改為private:

private void func()
{
    System.out.println("Parent::func()");
}

如下圖所示,則打印基類的func():

 

2.3JAVA繼承之如何通過派生類調用基類被覆蓋的方法

在上面第1節,我們講過派生類中有個隱藏的super,表示為基類.所以當基類被覆寫的方法時,我們可以通過super來調用基類的方法.

示例-super調用基類方法

class Parent
{
         public void func()
         {
                  System.out.println("Parent::func()");
         }
}

class Derived extends Parent
{
         public void func()            //覆寫父類的func方法
         {
                  super.func();             //調用父類的func,如果不加super,則會出現一直遞歸
                  System.out.println("Derived::func()");
         }
}

public class Test{
                  public static void main(String args[]){
                    Derived d = new Derived();
                    d.func();
                 }       
}

打印如下:

 

 

3.final關鍵字

在java中,final被稱為終結器, final可以修飾變量,方法和類.

3.1 final修飾類

當final修飾類時,則表示該類為最終的,也就是說該類不能再有子類了,示例如下:

final class A {                 // 修飾該類不能有子類
}

class B extends A {             // 錯誤的繼承
}

 

3.2 final修飾方法

當在某個類的方法前面定義final時,則表示該方法不允許在子類里進行方法覆寫(可以實現方法重載)

示例如下:

class A {
         public final void fun() {}       //此方法不允許子類覆寫
         public void fun(int i) {}        //可以實現方法重載
}

class B extends A {
         public void fun() {}            // 錯誤:此處不允許覆寫
}

 

3.3 final修飾變量

當final修飾變量時,則表示該變量為常量(類似C++中const).示例如下:

public static final String LICENSE = "GPL";                      //修飾全局常量,定義常量時,名稱需大寫

 

下章學習: 8.JAVA-向上轉型、向下轉型

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM