zoukankan      html  css  js  c++  java
  • 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=左边!

     

     

  • 相关阅读:
    HDU1720 A+B Coming
    HDU1390 ZOJ1383 Binary Numbers
    HDU1390 ZOJ1383 Binary Numbers
    HDU2504 又见GCD
    HDU2504 又见GCD
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1020 ZOJ2478 Encoding
    HDU1020 ZOJ2478 Encoding
    HDU2097 Sky数
  • 原文地址:https://www.cnblogs.com/yxi-liu/p/8418017.html
Copyright © 2011-2022 走看看