天天看點

java學習之繼承、重載、重寫(覆寫)

java中使用extends關鍵字完成繼承,和C++中的繼承不同之處在于java隻支援單繼承,不支援多重繼承。 繼承讓我們的代碼編碼變得簡單,維護也變得簡單,擴充變得容易。我們在繼承的時候不能繼承構造方法,一個類得到構造方法隻有兩種方法,一種是自己定義構造方法,一種是使用JVM配置設定的預設構造方法。

當方法名稱相同,但是參數不一樣的時候,這就是方法的重載:

  • 方法的重載傳回值類型可以不一樣
  • 方法的修飾符也可以不一樣
  • main方法也可以被重載

方法重寫 :如果在子類中定義一個方法,其名稱、傳回類型及參數簽名正好與父類中某個方法的名稱、傳回類型及參數簽名相比對,那麼可以說,子類的方法覆寫了父類的方法。

  • 子類的方法名稱傳回類型及參數簽名 必須與父類的一緻
  • 子類方法不能縮小父類方法的通路權限
  •  子類方法不能抛出比父類方法更多的異常
  • 方法覆寫隻存在于子類和父類之間,同一個類中隻能重載
  • 父類的靜态方法不能被子類覆寫為非靜态方法
  • 子類可以定義于父類的靜态方法同名的靜态方法,以便在子類中隐藏父類的靜态方法(滿足覆寫限制),    
  •             而且Java虛拟機把靜态方法和所屬的類綁定,而把執行個體方法和所屬的執行個體綁定。
  • 父類的非靜态方法不能被子類覆寫為靜态方法
  • 父類的私有方法不能被子類覆寫
  • 父類的抽象方法可以被子類通過兩種途徑覆寫(即實作和覆寫)
  • 父類的非抽象方法可以被覆寫為抽象方法
package www.fengkai.jicheng;
class A{
	public int a;
	public int b;
	public A(){
		a = 1;
		b = 2;
	}
	public  void tell() {
		System.out.println("a");
	}
	public void prin() {
		System.out.println(a + " " + b);
	}
}
class B extends A{
	public B(){
		a = 2;
		b = 3;
	}
	public  void tell() {
//		super.tell();
		System.out.println("b");
	}
}
public class Test01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		B b = new B();
		b.tell();
		b.prin();
	}

}
           

定義兩個類A和B,B類繼承于A類,擁有A類中定義的變量和方法,而B類中的tell()方法就是對A類中的tell()方法的重寫;

super關鍵字可以強行調用父類的方法執行,上述代碼中,不注釋super.tell()的話就會輸出A類中的tell和B 類中的tell

  • 父類的成員變量和方法為private使用super通路編譯出錯
  • 在類的構造方法中,通過super語句調用這個類的父類的構造方法
  • 在子類種通路父類的被屏蔽的方法和屬性
  • 隻能在構造方法或執行個體方法内使用super關鍵字,而在靜态方法和靜态代碼塊内不能使用super