求问一道题目 答案为什么等于18

解决方案 »

  1.   

    你的代码中涉及到两个知识点:继承和多态
    继承中的构造方法 
    1、子类的构造过程中必须调用其基类的构造方法。(因为要继承,所以必须先实例化父类,不然怎么继承)
    2、子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法。
        2.1、使用this(argument_list)调用本类的另外构造方法。
        2.2、如果调用super()或者this(),必须写在子类构造方法的第一行(但如果仅是通过this或super来访问成员属性则没有这个要求)。
    3、如果子类的构造方法中没有显式的调用基类的构造方法,则系统默认调用基类的无参数构造方法。
    4、如果子类构造方法中既没有显式调用基类构造方法,而基类又没有无参数的构造方法,则编译出错。
      

  2.   

    首先main里面构造的subClass传给了superClass,那superClass运行时的对象实际是subClass,构造子类对象首先调用父类构造方法再调用子类构造方法,因为子类重写了add方法,那父类调用add方法就是调用子类重写的add方法,所以add时每次+2*i,一共加了1,2,6所以是18
      

  3.   

    掌握点1:类的生命周期
    有父子类的情况:
    (1)父类的static变量和static初始化块
    (2)子类的static变量和static初始化块
    (3)父类的实例变量、初始化块
    (4)父类的构造方法
    (5)子类的实例变量、初始化块
    (6)子类构造方法
    2.多态与继承:
    子类重写父类的方法,多态下调用子类方法,没有重写的方法,调用父类的方法。
    因此执行顺序为J_SuperClass()->父类mb_add()->J_SupClass()->子类mb_add()  注意,父类子类都执行了mb_add()方法,但是结果并不相互影响,此时m_data=5  ->子类mb_add() 此时m_data=18,调用父类print();