22吧,i应该被初始化成0,先是
Base() {
add(1);
}
然后i=2
Extension() {
add(2);
}
在i=6
class Extension extends Base {
void add(int v) {
i += v*2;
}
}
i=22

解决方案 »

  1.   

    Example:
    A extends B;B extends C程序运行顺序:C中的interface/static-->B中的interface/static-->A中的interface/static-->C中的instance variable/constructor-->B中的instance variable/constructor-->A中的instance variable/constructor-->A中的main()里面还有更深的概念,自己写程序去试:System.out.println("check: "+ variable):
      

  2.   

    流程是这样的,先初始化
    static void bogo(Base b) {
    b.add(8);
    b.print();
    }
    然后才开始main()方法,但当bogo方法调用到 Base类的变量时,又要先初始化Base类,然后在类推,太烦了,你自己推吧!
      

  3.   

    程序开始从main函数执行:
         bogo(new Extension());//调用Extension的构造函数,从而调用base类
                                 的构造函数,但是基类的构造函数中调用了
                                 add函数,此时的add函数为什么是Extension
                                 类的add函数而不是base类的add函数
      

  4.   

    结果是:22
    Extension类从Base类继承了i,但覆盖了add方法,所以两个类中的i是同一个。
    在jtest类中,new Extension()创建了一个新的子类对象,首先执行父类的构造方法,其中的方法add指的是子类的add(多态性),i变成2,再执行子类的构造方法,i变成6
    然后并作为参数传递给方法bogo,bogo的参数是Base类的(把子类对象的引用赋给了参数b)
    b.add(8)调用的是子类的add方法,因此为22
      

  5.   

    bogo函数的参数为Base类型的
        在执行bogo(new Extension())时,是不是把Extension类型的成员隐式转化为Base类型的成员?那么b.add(8)为什么又调用的是子类的函数成员.
        另外请大家给推荐一下有详细讲解此方面问题的书,最好有电子版:),先谢过了
      

  6.   

    主要是 1.构建器的初始化顺序:父类构建器->子类构建器
            2.方法覆盖:在类Base中add(int v)方法被覆盖