在Java中,所有的实例方法(Instance Method)调用的时候都会把当前对象压入当前帧中,Java虚拟机正是通过这个参数来决定当前所使用的类(通过判断该对象的类型)。
那么如下:
class A {
 public A(){
  
 }
 public void fa() {
  System.out.println("CLASS A :Function fa Runing......");
 } public void fb() {
  System.out.println("CLASS A :Function fb Runing......");
  fa();
  System.out.println("CLASS A :Function fb Stop......");
 }
}class B extends A {
 public B(){
 }
 public void fa() {
  System.out.println("CLASS B :Function fa Runing......");
 } public void fb() {
  System.out.println("CLASS B :Function fb Runing......");
  super.fb();
  System.out.println("CLASS B :Function fb Stop......");
 }
}public class Polymorphism{
 public static void main(String[] args) {
  A b = new B();
  b.fb();
 }
}那么在上边的这个例子中:
main中调用b.fb()时,压入的当前对象自然是B类对象,我们记为b。在B的fb()中调用super.fb()时,压入的就是刚刚压入的对象为什么还是b呢?同样,在A的fb中调用fa()时,为什么也是b。这些方法具体是怎么样调用的,请高手详细解释一下~!
谢谢了~!

解决方案 »

  1.   

    代码贴错了,应该是如下代码:
    class A {
     public A(){
      
     }
     public void fb() {
      System.out.println("CLASS A :Function fb Runing......");
      fa();
      System.out.println("CLASS A :Function fb Stop......");
     }
    }class B extends A {
     public B(){
     }
     public void fa() {
      System.out.println("CLASS B :Function fa Runing......");
     } public void fb() {
      System.out.println("CLASS B :Function fb Runing......");
      super.fb();
      System.out.println("CLASS B :Function fb Stop......");
     }
    }public class Polymorphism{
     public static void main(String[] args) {
      A b = new B();
      b.fb();
     }
    }
      

  2.   

    我不太明白楼主的意思,你是问为什么class B的super.fb()为什么调用class A的fb()最终会运行class B的fa()吗?
      

  3.   

    不是那个意思
    在Java中,所有的实例方法(Instance Method)调用的时候都会把当前对象压入当前栈中吗,
    那上例在B的fb()中调用super.fb()时,压入的就是刚刚压入的对象为什么还是b呢?同样,在A的fb中调用fa()时,为什么也是b。
      

  4.   

    楼主运行过么? 编译都不会通过的。
    class A {
     public A(){
      
     }
     public void fb() {
      System.out.println("CLASS A :Function fb Runing......");
      fa();
      System.out.println("CLASS A :Function fb Stop......");
     }
    }fa()没有定义。
      

  5.   

    不是b是谁啊?super.xx();只是显示的使用了b调用父类的方法,而没有使用默认的动态绑定。
      

  6.   

    class A {
     public A(){
      
     }
    //加下列代码才可以的!!!!!
     public void fa(){
      System.out.println("ClASS A:Function fa Runing.....");
     }
     public void fb() {
      System.out.println("CLASS A :Function fb Runing......");
      fa();
      System.out.println("CLASS A :Function fb Stop......");
     }
    }class B extends A {
     public B(){
     }
     public void fa() {
      System.out.println("CLASS B :Function fa Runing......");
     } public void fb() {
      System.out.println("CLASS B :Function fb Runing......");
      super.fb();
      System.out.println("CLASS B :Function fb Stop......");
     }
    }public class Polymorphism{
     public static void main(String[] args) {
      A b = new B();
      b.fb();
     }
    }
    结果:
    CLASS B :Function fb Runing......
    CLASS A :Function fb Runing......
    CLASS B :Function fa Runing......
    CLASS A :Function fb Stop......
    CLASS B :Function fb Stop......分析:
    如果不加上面的代码编译通不过,你可能考虑到动态绑定,但动态绑定是发生在运行中的。
    至于为什么出现这个结果:
    在Java中,所有的实例方法(Instance Method)调用的时候都会把当前对象压入当前栈中。看看Main()里面
    new B() 对象B 压栈,类B后面有extends A
    加载类A ,初始化A的数据成员,A构造器。接下来是B类的数据成员初始化,B构造器。b.fb(); 调用的当然是对象B的fb(); 打印:CLASS B :Function fb Runing......
    super.fb();调用的当然是对象A的fb();打印:CLASS A :Function fb Runing......接下来调用fa();
    此时的fa();不是类A的方法,而是类B的fa();(为什么?这个属于动态绑定的内容)打印:CLASS B :Function fa Runing...... CLASS A :Function fb Stop......
    super.fb()完毕,接下来继续执行CLASS B :Function fb Stop......
    不知道说清楚了没有!!!!