解决方案 »

  1.   

    1、 6
    2、 
    a、你不要纠结父类是怎么样的,实际上只有1个类,就是子类,子类会获得父类的方法,实际上执行的还是子类,所以第一问,为什么是6,因为是子类执行的方法,子类里又有自己定义的num覆盖了从父类集成的num,所以打印出来的是自己的6,如果不覆盖,打印的就是5; 
    b、这个学名叫做重写,是子类覆盖掉了父类的方法,如果不覆盖,执行的是父类的逻辑,如果覆盖,执行的是子类的逻辑
      

  2.   

    eclipse直接运行结果如下:
    第一个Fu show 5
    第二个Zi show 6
      

  3.   

    1:Fu show 5
      子类没有Override父类的show方法,相当于Override的时候写了一个super.show(),父类根本不知道子类有个叫num的东西,只会打印自己的num,所以是5。
    2:Zi show 6
      子类Override了父类的方法,子类就拥有了自己的行为,所以就知道自己有个叫num的东西,打印6。
    不知道这样解释通不通,期待高人来解释。
      

  4.   

    疏忽了,第一个问题打印出来确实是5,这里给LZ从两个层面解释一下:语法层面,子类里引用父类的方法,父类方法里引用的域是父类的域,不是子类的域,所以打印出来是5.这个方法如果存在在子类里,引用的是this.i,也就是子类的域,如果想引用到父类的域,可以用super.i,换句话说,子类里有两个i,默认是this.i,实际上还有一个被隐藏起来的super.i。编译层面,我特意查了一下编译出来的字节码,从字节码来看,子类继承父类,但是父类的方法并没有出现在子类的字节码里,换句话说,在内存的角度上,子类的内存空间里只有子类自己的东西,而父类的东西都存在于一个super指针里,所以当调用父类的方法的时候,实际上是进入了super指针指向的父类的内存空间,这个内存空间里是肯定不会有子类的域的,所以这里只能引用到父类的域,打印出来是5.
      

  5.   

    这两段程序的关键在于this.num
    1、Zi没有show方法,故上溯到Fu。因此用的是Fu的num值。
    2、Zi重写了show方法,故只需调用自身的show方法即可。因此用的是Zi的num值。
      

  6.   

       涉及到重写的问题,本来基础了父类,就具有了父类的行为,也就是父类的方法,用Fu应用的时候,虚拟机会首先查看父类是否有该方法吧,,子类没有重写,当然调用的是父类的方法,如果子类重写了,就会找到子类的;虚拟机应该是设计成这样的,先在子类找,找不到就默认使用super向上转型找到父类的;
       还有一种情况就是,如果父类的show方法是静态的,那就不会调用子类重写的方法了;实际编程的时候应该不会再子类又重新声明了同名的成员变量,本来继承父类就是为了使用父类的成员变量这个属性的
      

  7.   

    第一个是5  第二个是6  因为 第二个 把父类的show()方法 给覆盖了(重写)  你就这吗理解吧 覆盖了父类的方法 并且重写了 这样 再调用这个方法的时候 就输出了Zi类的结果  如果Zi类还有子类 并且也覆盖了show() 那就跟着他的“孙子”走 以此类推。