class Parents{
   public Fun()
   {
     System.out.println("Parents");
   }
}
class Son extends Parents{
   public Fun()
   {
     Fun();//*
     System.out.println("Son");
   }
}
}
这里注释*这句是怎么处理的?

解决方案 »

  1.   

    public Fun()  少写个 void.这就是循环调用,死循环, 应该用 super.Fun()调用 parents的Fun方法
      

  2.   

     子类的目的应该是想先调用父类的该方法再处理自己的吧
    应该把子类中Fun()方法写成如下
    public Fun()
       {
         super.Fun();//先调用父类的Fun方法
         System.out.println("Son");
       }
      

  3.   

    直接手打的~少了个void~不好意思啊~就是子类在覆盖FUN里面是怎么处理啊~昨晚上的,西安的笔题,一个选择题(全英文考题— —!)
      

  4.   

    应该是super.Fun()吧,执行一次父类的方法,然后执行自己要扩充的额外动作。
    这里写法是个死递归。
      

  5.   

    不加super的后果是死循环么?这个格式让我联想起了递归~就是没有出口— —
      

  6.   

    class Parents{
       public void Fun()
       {
         System.out.println("Parents");
       }
    }
    class Son extends Parents{
       public void Fun()
       {
         Fun();//*
         System.out.println("Son");
       }
    }
    }
    原题是选择输出结果
    1:Parents
    2:Son
    3:Parents
       Son
    4:(大概就是报错什么的,英文考题,没太看明白)
    这里应该报个什么错误?
      

  7.   

    Son s = new Son();
    s.Fun();
      

  8.   

    死循环  会报错
    Exception in thread "main" java.lang.StackOverflowError
    at test.Son.Fun(TestLog4j.java:14)
            at test.Son.Fun(TestLog4j.java:14)
    at test.Son.Fun(TestLog4j.java:14)
    at test.Son.Fun(TestLog4j.java:14)
    at test.Son.Fun(TestLog4j.java:14)
    at test.Son.Fun(TestLog4j.java:14)
    at test.Son.Fun(TestLog4j.java:14)
    at test.Son.Fun(TestLog4j.java:14)
    at test.Son.Fun(TestLog4j.java:14)
            …………………………
      

  9.   

    报错是因为死递归(不同于死循环)造成的栈溢出,和死循环还死得不一样。每调用一次函数,当前的程序相关信息会做现场保护(什么flag,寄存器,程序指针什么的),把信息push进一个栈,然后去运行调用的函数,完毕之后回来从栈pop出信息,恢复现场,继续运行,死递归只有push没有pop,因为一直在调用同一个函数,没有结束,栈就溢出了。这里的效果和任何一个如下函数是一样的,跟重写不重写无关了  public static void sdg(){
        sdg();
      }
      public static void main(String[] args) {
        sdg();
      }