一、繼承的格式
在繼承的關係中,“子類就是一個父類”。也就是說,子類可以被當做父類看待。
例如父類是員工,子類是講師,那麼“講師就是一個員工”。關係:is-a。
定義父類的格式:(一個普通的類定義)
public class 父類名稱 {
// ...
}
定義子類的格式:
public class 子類名稱 extends 父類名稱 {
// ...
}
二、繼承後的特點——子類父類 重名成員變量
在父子類的繼承關係當中,如果成員變量重名,則創建子類對象時,訪問有兩種方式:
- 直接通過子類對象訪問成員變量:
等號左邊是誰,就優先用誰,沒有則向上找。 - 間接通過成員方法訪問成員變量:
該方法屬於誰,就優先用誰,沒有則向上找。
三、繼承後的特點——子類父類 重名成員方法
在父子類的繼承關係當中,創建子類對象,訪問成員方法的規則:
- 創建的對象是誰,就優先用誰,如果沒有則向上找。
注意事項: 無論是成員方法還是成員變量,如果沒有都是向上找父類,絕對不會向下找子類的。
重寫(Override)
概念:在繼承關係當中,方法的名稱一樣,參數列表也一樣。
重寫(Override):方法的名稱一樣,參數列表【也一樣】。覆蓋、覆寫。
重載(Overload):方法的名稱一樣,參數列表【不一樣】。
重寫特點:
方法的覆蓋重寫特點:創建的是子類對象,則優先用子類方法。
-
必須保證父子類之間方法的名稱相同,參數列表也相同。
@Override:寫在方法前面,用來檢測是不是有效的正確覆蓋重寫。
這個註解就算不寫,只要滿足要求,也是正確的方法覆蓋重寫。 -
子類方法的返回值必須【小於等於】父類方法的返回值範圍。
小擴展提示:java.lang.Object類是所有類的公共最高父類(祖宗類),java.lang.String就是Object的子類。 -
子類方法的權限必須【大於等於】父類方法的權限修飾符。
小擴展提示:public > protected > (default) > private
備註:(default)不是關鍵字default,而是什麼都不寫,留空。
三個變量表示方式
- 局部變量: 直接寫成員變量名
- 本類的成員變量: this.成員變量名
- 父類的成員變量: super.成員變量名
四、繼承後的特點——構造方法
繼承關係中,父子類構造方法的訪問特點:
- 子類構造方法當中有一個默認隱含的“super()”調用,所以一定是先調用的父類構造,後執行的子類構造。
- 子類構造可以通過super關鍵字來調用父類重載構造。
- super的父類構造調用,必須是子類構造方法的第一個語句。不能一個子類構造調用多次super構造。
總結: 子類必須調用父類構造方法,不寫則贈送super( );寫了則用寫的指定的super調用,super只能有一個,還必須是第一個。
super和this
super:
super關鍵字的用法有三種:
- 在子類的成員方法中,訪問父類的成員變量。
- 在子類的成員方法中,訪問父類的成員方法。
- 在子類的構造方法中,訪問父類的構造方法。
super關鍵字用來訪問父類內容,而this關鍵字用來訪問本類內容。用法也有三種:
this:
super關鍵字用來訪問父類內容,而this關鍵字用來訪問本類內容。用法也有三種:
- 在本類的成員方法中,訪問本類的成員變量。
- 在本類的成員方法中,訪問本類的另一個成員方法。
- 在本類的構造方法中,訪問本類的另一個構造方法。
在第三種用法當中要注意:
A. this(…)調用也必須是構造方法的第一個語句,唯一一個。
B. super和this兩種構造調用,不能同時使用。
四、抽象類
父類中的方法,被它的子類們重寫,子類各自的實現都不盡相同。那麼父類的方法聲明和方法主體,只有聲明還有
意義,而方法主體則沒有存在的意義了。我們把沒有方法主體的方法稱爲抽象方法。Java語法規定,包含抽象方法
的類就是抽象類。
抽象方法:就是加上abstract關鍵字,然後去掉大括號,直接分號結束。
抽象類:抽象方法所在的類,必須是抽象類纔行。在class之前寫上abstract即可。
如何使用抽象類和抽象方法:
- 不能直接創建new抽象類對象。
- 必須用一個子類來繼承抽象父類。
- 子類必須覆蓋重寫抽象父類當中所有的抽象方法。
覆蓋重寫(實現):子類去掉抽象方法的abstract關鍵字,然後補上方法體大括號。 - 創建子類對象進行使用。
public abstract class Animal {
// 這是一個抽象方法,代表喫東西,但是具體喫什麼(大括號的內容)不確定。
public abstract void eat();
// 這是普通的成員方法
// public void normalMethod() {
//
// }
}
一個抽象類不一定含有抽象方法,
只要保證抽象方法所在的類是抽象類,即可。
這樣沒有抽象方法的抽象類,也不能直接創建對象,在一些特殊場景下有用途。