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-向上轉型、向下轉型