目錄
1、繼承概述
2、繼承的好處和弊端
3、繼承中變數的訪問特點
4、super關鍵字
5、基礎中構造方法的訪問特點
6、方法重寫
繼承是所有OOP語言和Java語言不可缺少的組成部分,當創建一個類時,一定會繼承其他的類,即使自己沒有定義繼承任何父類,Java語言也會隱式繼承Java的標準根基類Object,既然繼承這么重要,我們就一起來好好研究一下吧!
1、繼承概述
繼承的格式
- 格式:public class 子類名 extends 父類名{}
- 范例:public class Son extends Father{}
- Father:是父類,也被稱為基類、超類
- Son:是子類,也被稱為派生類
繼承中子類的特點
- 子類可以有父類的內容
- 子類還可以有自己的內容
比如定義一個Farher類,再定義一個Son類繼承Father的姓氏和方法,請看下面代碼:
public class Father {
public String name="李";
public void showFather(){
System.out.println("我是父親,我姓:"+name);
}
}
public class Son extends Father{
public void showSon(){
System.out.println("我是兒子,我姓:"+name);
}
}
public class Main {
public static void main(String[] args){
Son son = new Son();
son.showSon();
son.showFather();
}
}
子類Son繼承了父類Father的name和showFather方法,運行結果:

2、繼承的好處和弊端
繼承好處:
- 提高了代碼的復用性(多個類相同的成員可以放在同一個類中)
- 提高了代碼的維護性(如果方法的代碼需要修改,修改一處即可)
繼承弊端
- 繼承讓類與類之間產生了關系,類的耦合性增強了,當父類發生變化時,子類也不得不發生變化,削弱了子類的獨立性,
什么時候使用繼承?
- 繼承體現的關系:is a
- 假設法:有兩個類A和B,如果這兩個類之間滿足A是B的一種,或者B是A的一種,就說明他們之間存在繼承關系,這個時候就可以考慮繼承來體現,否則就不能濫用繼承,
- 舉例:蘋果和水果(繼承)、動物和貓(繼承)、狗和貓(非繼承)
3、繼承中變數的訪問特點
在子類方法中訪問一個變數
- 子類區域范圍查找
- 子類成員范圍查找
- 父類成員范圍查找
請看下面的案例:
public class Father {
public Integer age;
public String name;
public String sex;
Father(){
age = 56;
name = "老子";
sex = "男";
}
}
public class Son extends Father{ //繼承Father類
public Integer age;
public String name;
Son(){
age = 23;
name = "兒子";
}
//子類區域范圍查找
public void showAge(){
Integer age = 22;
System.out.println("我的年齡是:"+age);
}
//子類成員范圍查找
public void showName(){
System.out.println("我的名字是:"+name);
}
//父類成員范圍查找
public void showSex(){
System.out.println("我的性別是:"+sex);
}
}
測驗類如下:
public class MainDemo {
//測驗類
public static void main(String[] args) {
Son son = new Son();
son.showAge(); //子類區域范圍查找
son.showName(); //子類成員范圍查找
son.showSex(); //父類成員范圍查找
}
}
測驗結果:

4、super關鍵字
super關鍵字的用法和this關鍵字的用法類似
this代表本類物件的參考
super代表父類存盤空間的標識(可以理解為父類物件參考)
| 關鍵字 | 訪問成員變數 | 訪問建構式 | 訪問成員方法 |
| this | this.成員變數 訪問本類成員變數 | this(...) 訪問本類構造方法 | this.成員方法(...) 訪問本類成員方法 |
| super | super.成員變數 訪問父類成員變數 | super(...) 訪問父類構造方法 | super.成員方法(...) 訪問父類成員方法 |
//父類
public class Father {
public Integer age;
public String name;
public String sex;
Father(){
age = 56;
name = "老子";
sex = "男";
}
}
//子類繼承父類Father
public class Son extends Father{
public Integer age;
public String name;
Son(){
age = 23;
name = "兒子";
}
//子類區域范圍查找
public void showAge(){
Integer age = 22;
System.out.println("我的年齡是:"+age);
}
//父類區域范圍查找
public void showFatherAge(){
System.out.println("我父親的年齡是:"+super.age);
}
}
public class MainDemo {
//測驗類
public static void main(String[] args) {
Son son = new Son();
son.showAge(); //輸出子類的年齡值
son.showFatherAge();//輸出父類的年齡值
}
}
程式運行結果:

5、基礎中構造方法的訪問特點
子類中所有的構造方法默認都會父類中無參的構造方法
- 子類會繼承父類的資料,可能還會使用父類的資料,所以,子類初始化之前,一定要先完成父類的初始化,
- 每一個子類構造方法的第一條陳述句默認都是:super()
如果父類中沒有無參構造方法,只有帶參構造方法,該怎么辦?
- 通過使用super關鍵字去顯示的呼叫父類的帶參構造方法
- 只能在子類建構式中顯示呼叫父類建構式,而且必須在子類建構式第一行代碼顯示呼叫
//父類
public class Father {
public Integer age;
public String name;
public String sex;
//默認建構式
Father(){
System.out.println("我是父類無參構造方法");
age = 56;
name = "老子";
sex = "男";
}
//有參建構式
Father(Integer age){
System.out.println("我是父類有參構造方法");
this.age = age;
}
}
//子類繼承父類Father
public class Son extends Father{
public Integer age;
public String name;
//默認建構式
Son(){
System.out.println("我是子類無參構造方法");
age = 23;
name = "兒子";
}
//有參建構式
Son(Integer age){
super(60); //顯示呼叫父類建構式,必須放在子類建構式的第一行代碼
System.out.println("我是子類有參構造方法");
this.age = age;
name = "兒子";
}
//輸出兒子的年齡
public void showAge(){
System.out.println("我的年齡是:"+age);
}
//輸出父親的年齡
public void showFatherAge(){
System.out.println("我父親的年齡是:"+super.age);
}
}
public class MainDemo {
//測驗類
public static void main(String[] args) {
Son son = new Son(); //此時先呼叫父類默認構造方法,再呼叫子類無參構造方法
son.showAge(); //輸出子類的年齡值
son.showFatherAge();//輸出父類的年齡值
Son son1 = new Son(30); //此時先呼叫父類有參構造方法,再呼叫子類有參構造方法
son1.showAge(); //輸出子類的年齡值
son1.showFatherAge();//輸出父類的年齡值
}
}
程式運行結果:

6、方法重寫
方法重寫概述
- 子類中出現了和父類中一模一樣的方法宣告
- 子類修改來自父類繼承的方法
例如:子類和父類都有showAge()方法時,子類就重寫了父類的showAge()方法
//父類
public class Father {
public Integer age;
public String name;
public String sex;
//默認建構式
Father(){
age = 56;
name = "老子";
sex = "男";
}
//輸出年齡
public void showAge(){
System.out.println("我的年齡是:"+age);
}
}
//子類繼承父類Father
public class Son extends Father{
public Integer age;
public String name;
//默認建構式
Son(){
age = 23;
name = "兒子";
}
//輸出兒子的年齡
public void showAge(){
System.out.println("我的年齡是:"+age);
}
}
public class MainDemo {
//測驗類
public static void main(String[] args) {
Son son = new Son(); //此時先呼叫父類默認構造方法,再呼叫子類無參構造方法
son.showAge(); //此時會呼叫子類重寫后的方法
}
}
程式運行結果:

End:感謝您閱讀全文!
/******************************************************************************************
* 作者簡介:本人擅長C++、Java和演算法開發,具有7年一線開發經驗,目前在某人工智能公司任技術總監,
* 歡迎關注我的公眾號【碼農充電站】,公眾號里為大家準備了編程干貨和精品專案原始碼,如果你覺得還不
* 錯,不妨微信搜索【碼農充電站】或者在文章左側掃描二維碼加入我的公眾號吧!
*****************************************************************************************/
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/278846.html
標籤:java
上一篇:二貨小易有一個W*H的網格盒子,網格的行編號為0~H-1,網格的列編號為0~W-1。每個格子至多可以放一塊蛋糕,任意兩塊蛋糕的歐幾里得距離不能等于2。
