【Java繼承】(超級詳細!!!)
- 1、 繼承的概念
- 2 、繼承的語法
- 3、 父類成員訪問
- 3.1 子類中訪問父類的成員變量
- 3.2 子類中訪問父類的成員方法
- 4、 super關鍵字
- 5 、子類的構造方法
- 6、 繼承關系上的執行順序
- 7、protected 關鍵字
- 8、繼承方式
- 9、final 關鍵詞
1、 繼承的概念
繼承機制:是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加新功能,這樣產生新的類,稱派生類。繼承呈現了面向對象程序設計的層次結構, 體現了由簡單到復雜的認知過程。繼承主要解決的問題是:共性的抽取,實現代碼復用。
例如:小貓和小狗都是(有名字有年齡要吃飯)的動物。
上述圖示中,Dog和Cat都繼承了Animal類。
其中:Animal類稱為父類/基類或超類,Dog和Cat可以稱為Animal的子類/派生類。
繼承之后,子類可以復用父類中成員,子類在實現時只需關心自己新增加的成員即可。
下面我們將學習繼承的語法,利用代碼實現上述繼承關系!
2 、繼承的語法
修飾符 class 子類名 extend 父類名(){//...
}
注意:
- 子類會將父類中的成員變量或者成員方法繼承到子類中
- 子類繼承父類之后,必須要新添加自己特有的成員,體現出與基類的不同,否則就沒有必要繼承了
3、 父類成員訪問
3.1 子類中訪問父類的成員變量
- 如上圖a所示:當子類和父類中同時有成員變量a時,訪問的是子類的成員變量a
- 如上圖b所示:當子類沒有成員變量b,而父類有成員變量b時,訪問的是父類的成員變量b
- 如上圖c所示:當子類有成員變量c,父類沒有成員變量c時,訪問的是子類的成員變量c
注意:
成員變量訪問遵循就近原則,自己有優先自己的,如果沒有則向父類中找。
3.2 子類中訪問父類的成員方法
- 如上圖test1所示:子類中沒有成員方法test1,父類中有成員方法test1,所以訪問的是父類中的成員方法test1
- 如上圖test2所示:子類中有成員方法test2,父類中沒有成員方法test2,所以訪問的是子類中的成員方法test2
- 如上圖test所示:子類和父類都有成員方法test,同樣遵循就近原則,訪問的是子類的成員方法test
下面我們進行一個小測試,從而使我們更深入的了解該知識點。
//父類
public class Father {int a=1;int b=1;public void test1(int a){System.out.println("父類test1,數字結果為:"+a);}public void test1(){System.out.println("父類test1,無參數");}}
//子類
public class Son extends Father{int a=2;int c=2;public void test1(){System.out.println("子類test1,無參數");}public void func(){test1();test1(a+c);test1(b+c);}
}
//主函數
public class Main {public static void main(String[] args) {Son son=new Son();son.func();}
}
打印結果:
子類test1,無參數
父類test1,數字結果為:4
父類test1,數字結果為:3
4、 super關鍵字
通過上述知識我們知道:當子類和父類中存在相同名稱的成員時,訪問子類的成員。
那么,,如果要在子類方法中訪問父類同名成員時,該如何操作?
此時便需要用到關鍵詞super
- super只能在非靜態方法中使用
- 在子類方法中訪問父類的成員變量和方法
super的用法遠不止這些,super的其他方法會在下文中提到。
5 、子類的構造方法
- 若父類顯式定義無參或者默認的構造方法,在子類構造方法第一行默認有隱含的super()調用,即調用基類構造方法
- 如果父類構造方法是帶有參數的,此時需要用戶為子類顯式定義構造方法,并在子類構造方法中選擇合適的父類構造方法調用,否則編譯失敗。
- 在子類構造方法中,super(…)調用父類構造時,必須是子類構造函數中第一條語句。
- super(…)只能在子類構造方法中出現一次,并且不能和this同時出現
6、 繼承關系上的執行順序
//父類
public class Father1 {int a;int b;//構造方法public Father1(int a, int b) {this.a = a;this.b = b;System.out.println("父類,構造方法");}{System.out.println("父類,實例方法");}static {System.out.println("父類,靜態方法");}
}
//子類
public class Son extends Father1 {public Son(int a, int b) {super(a, b);System.out.println("子類,構造方法");}{System.out.println("子類,實例方法");}static {System.out.println("子類,靜態方法");}
}
//主方法
public class Main {public static void main(String[] args) {Son son=new Son(1,2);System.out.println("=============");Son son1=new Son(1,2);}
}
打印結果:
父類,靜態方法
子類,靜態方法
父類,實例方法
父類,構造方法
子類,實例方法
子類,構造方法
=============
父類,實例方法
父類,構造方法
子類,實例方法
子類,構造方法
由上述代碼可以得出結論:
- 首先依次執行父子類的靜態方法
- 接著依次進行父類的實例方法和構造方法
- 最后依次進行子類的實例方法和構造方法
- 靜態方法只執行一次
7、protected 關鍵字
1.同一包中的同一類
2.同一包的不同類
3.不同包中的子類
4.不同包中的非子類
8、繼承方式
注意:Java不能實現多繼承!!!
9、final 關鍵詞
1.final 修飾變量或字段
2.final 修飾類
3.final 修飾方法