Java ,python面向對象的繼承及其區別


JAVA

JAVA繼承基本樣式  

class Demo extends Object{
    Demo(int a){
        this();
    }
    Demo(){
        super();
    }
}

java默認繼承Object 類, 並一定會在構造函數中調用super()方法,對父類進行實例化。注意:this()和super()不能同時出現在同一個構造函數中,但super()必須在其中一個構造函數中出現!

 

Java實例化過程

  1. 運行父類的靜態代碼部分
  2. 再運行子類的靜態代碼部分
  3. 執行父類成員代碼
  4. 執行父類構造函數 —— 父類完成實例化
  5. 執行子類的成員代碼塊
  6. 執行子類的構造函數 ——子類實例化完成
# 先執行靜態代碼部分,包括靜態變量聲明賦值,靜態代碼塊等。
# !進行默認初始化(變量聲明,默認為null 或0)
# 調用構造函數 
# 通過子類構造函數調用父類的構造函數進行初始化——父類彈棧
# !進行子類的顯示初始化
# 子類特定函數的特定初始化
# 內存地址賦值給變量
java實例化過程的一些細節

 

PYTHON

PYTHON繼承基本樣式

class Demo(object):
    def __init__(self,a):
        super().__init__()
        self.a = a

python 實例化過程同java,默認繼承object需要對父類進行實例化。

Python實例化過程

  1. 執行父類的靜態代碼
  2. 執行子類的靜態代碼
  3. 執行子類__new__()方法
  4. 在子類__new__() 方法中調用父類__new__()方法
  5. 調用父類__init__()方法(父類實例化完成)
  6. 調用子類__init__()方法(子類實例化完成)
class Demo(object):
    # print("父類靜態")
    def __new__(cls, *args, **kwargs):
        # print("父類new")
        return object.__new__(cls)
    def __init__(self,a):
        # print("父類init")
        super().__init__()
        self.a = a

class A(Demo):
    def __new__(cls, *args, **kwargs):
        # print("子類new")   
        super().__new__(Demo)   #注意:這里默認調用父類的new,可以不寫且不調用父類new方法。同樣可以達到繼承的效果
        return object.__new__(cls)
    # print("子類靜態")
    def __init__(self):
        super().__init__(1)
        # print("子類init")
A()
python實例化過程

 

 

對比

  繼承

  Java   對象在調用父類中方法時,該方法調用的方法會優先使用子類的方法,調用的成員變量會優先調用父類的變量。

  Python  對象在調用父類中方法時,調用的方法和變量都優先調用子類的方法和變量。

 

  多態

  python天生多態

  java:因為涉及到變量屬性的問題,必須對對象進行降級和轉換才能使用子類的方法和屬性。

 

Animal a = new Cat();
//a並不能使用Cat類的功能,所有屬性和方法都是Animal父類的
Cat c = (Cat)a; //才能使用

 

以上例為例,在變量類型是實例類型的父類或者接口的時候,編譯和運行存在差別:

  1. 成員變量:在編譯和運行都參考Animal= 的左邊!
  2. 方法:編譯參考Animal= 左邊,父類有才編譯通過,運行優先參考Cat即參考=右邊。(在重名的情況下依然使用的是子類的方法,但是如果調用父類沒有的方法,是無法編譯通過的。)
  3. 靜態部分: 因為不需要對象,也不存在this,都是參考Animal=左邊!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM