super.b()方法是调用父类的b方法,在父类的b方法里调用a()方法,因为a()方法被重写了,所以调用的是子类的a()方法,还有就是在构造方法里调用时也是如此!

解决方案 »

  1.   

    父类去new一个子类的时候,它会现在子类当中去找,如果找到了就用子类的,没找到的话就会用父类的。
      

  2.   

    第一个问题,在父类中b方法调用a方法,默认是使用this调用,即this.a(),this指向当前实例,所以调用子类的a方法,打印zi --- a
      

  3.   

    第三个输出结果是这样的:既然你重写了a方法,在父类引用指向子类对象的时候,构造方法完成的时候,你就应该认为内存中子类对象里面有个引用指向了a方法,你实际上new出来的是什么对象,这个引用就指向该对象的a方法,所以实际调用的是子类的a方法,
    toString方法,你在父类中没有写,那么因为任何类都是Object的子类,所以你实际上调用的是Object中的toString方法,你看下api对这个方法的描述就懂了.
      

  4.   

    你那个例子,在此时的父类中,this其实是子类的对象的引用,所以a()相当于this.a() ,而此时,this指子类对象的引用。这一点要搞明白
      

  5.   

    super.toString() 就是 以字符串的形式输出信息,如果是在子类调用则会输出这个子类对象!
      

  6.   

    你好  那super.b()不是指父类的对象调用父类的对象的函数吗  那b方法里面还有个方法 那为啥不是调用的父类对象的方法啊   既然  super.b()是调用的父类的方法  那为啥b方法里面还有个方法不是调用父类的方法却调用子类的方法啊  想不明白啊 请指点
      

  7.   

    你好  那super.b()不是指父类的对象调用父类的对象的函数吗  那b方法里面还有个方法 那为啥不是调用的父类对象的方法啊   既然  super.b()是调用的父类的方法  那为啥b方法里面还有个方法不是调用父类的方法却调用子类的方法啊  想不明白啊 请指点
      

  8.   

    你好  那super.b()不是指父类的对象调用父类的对象的函数吗  那b方法里面还有个方法 那为啥不是调用的父类对象的方法啊   既然  super.b()是调用的父类的方法  那为啥b方法里面还有个方法不是调用父类的方法却调用子类的方法啊  想不明白啊 请指点
      

  9.   


    实际上super.b()不是指父类的对象调用父类方法.不等于f.b(),只是在子类中要调用父类方法用super关键字,你当前的对象实际上只是new出来的子类的对象
      

  10.   


    实际上super.b()不是指父类的对象调用父类方法.不等于f.b(),只是在子类中要调用父类方法用super关键字,你当前的对象实际上只是new出来的子类的对象
    能在解释的清楚点吗  那super.b()难道不是父类的对象调用父类的方法  是本身自己的对象调用父类的方法吗  能接受下为什么吗
      

  11.   


    class Zi extends Fu {
     public void a() {
       System.out.println("zi----a");
     }
     public void b() {
       System.out.println("zi----b");
     super.b();
       System.out.println(super.toString());
     }
     }这段代码可以理解成这个class Zi extends Fu {
     public void a() {
       System.out.println("zi----a");
     }
     public void b() {
       System.out.println("zi----b");
       System.out.println("fu---b");
       a();
       System.out.println(super.toString());
     }
     }
    实际上,是
      

  12.   


     class Zi extends Fu {
     public void a() {
       System.out.println("zi----a");
     }
     public void b() {
       System.out.println("zi----b");
     super.b();
       System.out.println(super.toString());
     }
     }这段代码可以理解为
     class Zi extends Fu {
     public void a() {
       System.out.println("zi----a");
     }
     public void b() {
       System.out.println("zi----b");
      System.out.println("fu---b");
       a();
       System.out.println(super.toString());
     }
     }
    super.b()就是做了代码的迭代。因为实际上执行的是Zi.b()方法,所以调用的事Zi.a()方法
      

  13.   

    多态做根本的思路就是类型转换,分成向上或者向下转型。这里你的情况属于向上转型,将父类的引用指向了子类的对象。这时这个父类的引用可以调用子类覆盖了父类中的那些方法。
      我的意思是说  super.b();   b里面嵌套还有a方法  为啥最后是调用子类的a方法而不是父类的a方法
      

  14.   


    实际上super.b()不是指父类的对象调用父类方法.不等于f.b(),只是在子类中要调用父类方法用super关键字,你当前的对象实际上只是new出来的子类的对象
     哎  还是不太明白啊
      

  15.   

    内存问题。new a() or new b() 是生成一个对象实例或对象引用,指向fu对象。