Java ,python面向對象的繼承及其區別
阿新 • • 發佈:2018-06-09
變量類型 CA col nim 靜態 closed 類的變量 his 通過
JAVA
JAVA繼承基本樣式
class Demo extends Object{ Demo(int a){ this(); } Demo(){ super(); } }
java默認繼承Object 類, 並一定會在構造函數中調用super()方法,對父類進行實例化。註意:this()和super()不能同時出現在同一個構造函數中,但super()必須在其中一個構造函數中出現!
Java實例化過程
- 運行父類的靜態代碼部分
- 再運行子類的靜態代碼部分
- 執行父類成員代碼
- 執行父類構造函數 —— 父類完成實例化
- 執行子類的成員代碼塊
- 執行子類的構造函數 ——子類實例化完成
PYTHON
PYTHON繼承基本樣式
class Demo(object): def __init__(self,a): super().__init__() self.a = a
python 實例化過程同java,默認繼承object,需要對父類進行實例化。
Python實例化過程
- 執行父類的靜態代碼
- 執行子類的靜態代碼
- 執行子類__new__()方法
- 在子類__new__() 方法中調用父類__new__()方法
- 調用父類__init__()方法(父類實例化完成)
- 調用子類__init__()方法(子類實例化完成)
對比
繼承
Java 對象在調用父類中方法時,該方法調用的方法會優先使用子類的方法,調用的成員變量會優先調用父類的變量。
Python 對象在調用父類中方法時,調用的方法和變量都優先調用子類的方法和變量。
多態
python天生多態
java:因為涉及到變量屬性的問題,必須對對象進行降級和轉換才能使用子類的方法和屬性。
Animal a = new Cat(); //a並不能使用Cat類的功能,所有屬性和方法都是Animal父類的 Cat c = (Cat)a; //才能使用
以上例為例,在變量類型是實例類型的父類或者接口的時候,編譯和運行存在差別:
- 成員變量:在編譯和運行都參考Animal即 = 的左邊!
- 方法:編譯參考Animal即 = 左邊,父類有才編譯通過,運行優先參考Cat即參考=右邊。(在重名的情況下依然使用的是子類的方法,但是如果調用父類沒有的方法,是無法編譯通過的。)
- 靜態部分: 因為不需要對象,也不存在this,都是參考Animal即=左邊!
Java ,python面向對象的繼承及其區別