Q22 
What will be written to the standard output when the following program is run? class Base { 
int i; 
Base() { 
add(1); 

void add(int v) { 
i += v; 

void print() { 
System.out.println(i); 


class Extension extends Base { 
Extension() { 
add(2); 

void add(int v) { 
i += v*2; 


public class Qd073 { 
public static void main(String args[]) { 
bogo(new Extension()); 

static void bogo(Base b) { 
b.add(8); 
b.print(); 

} 1) 9 
2) 18 
3) 20 
4) 21 
5) 22 答案是:5)22
我运行了程序,正是答案是正确的。
但就是不知道为什么,各位朋友帮帮忙!
谢谢

解决方案 »

  1.   

    换句话说, add()在子类中被覆盖了, 因此是一个动态绑定方法.
      

  2.   

    但是静态函数
    static void bogo(Base b) { 
    b.add(8); 
    b.print(); 

    中的b,不是在编译期就进行绑定了吗?她调用的应该是变量所属类型的那个类中的方法,也就是Base中的add方法啊。
    非静态函数是在运行时绑定,根据持有变量的真正对象来决定调用的方法。
    但是,这是静态方法啊~~~
      

  3.   

    class Base { 
    int i; 
    Base() { //第一步:先构造父类
    add(1);  //调用父类中的add方法

    void add(int v) { //第二步:结果使得i=1
    i += v; 

    void print() { 
    System.out.println(i); 


    class Extension extends Base { 
    Extension() {  //第三步:再构造子类
    add(2); //调用子类中的add方法

    void add(int v) { // //第四步:结果使得i=1+2*2=5
    i += v*2; 


    public class Qd073 { 
    public static void main(String args[]) { 
    bogo(new Extension()); 

    static void bogo(Base b) { 
    b.add(8); //第五步:调用Base也就是父类中的add方法,使得i=5+8=13
    b.print(); //第六步:打印13。才发现选项中居然没有13,晕死!!!看来错得很离谱啊!!

    } 哪位朋友能像我这种形式给出解释,就马上结贴!
      

  4.   

    class Base { 
      int i;   //i被初始化为0
      Base() { 
        add(1);  //add()被子类重写了, 因此调用子类的add(), i为0+1*2=2
      } 
      void add(int v) { 
        i += v; 
      } 
      void print() { 
        System.out.println(i); 
      } 
    } class Extension extends Base { 
      Extension() { 
        ////先调用父类构造函数, 得i=2
        add(2); //调用add(), 得i=2+2*2=6
      } 
      void add(int v) { 
        i += v*2; 
      } 
    }
     
    public class Qd073 { 
      public static void main(String args[]) { 
        bogo(new Extension());  //new Extension()的i已经是6, 再被b.add()调用, 得6+16=22
      } 
      static void bogo(Base b) { 
        b.add(8);  //调用Extension类中的add()方法, 即b.i = b.i + 8 * 2 = b.i + 16
        b.print(); 
      } 
    } 结果为22.
      

  5.   

    再补充一下, 虽然bogo()方法是静态的, 但这并不影响add()方法的动态绑定特性.