class Parents{ public Fun() { System.out.println("Parents"); } } class Son extends Parents{ public Fun() { Fun();//* System.out.println("Son"); } } } 这里注释*这句是怎么处理的?
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:(大概就是报错什么的,英文考题,没太看明白) 这里应该报个什么错误?
Son s = new Son(); s.Fun();
死循环 会报错 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) …………………………
报错是因为死递归(不同于死循环)造成的栈溢出,和死循环还死得不一样。每调用一次函数,当前的程序相关信息会做现场保护(什么flag,寄存器,程序指针什么的),把信息push进一个栈,然后去运行调用的函数,完毕之后回来从栈pop出信息,恢复现场,继续运行,死递归只有push没有pop,因为一直在调用同一个函数,没有结束,栈就溢出了。这里的效果和任何一个如下函数是一样的,跟重写不重写无关了 public static void sdg(){ sdg(); } public static void main(String[] args) { sdg(); }
应该把子类中Fun()方法写成如下
public Fun()
{
super.Fun();//先调用父类的Fun方法
System.out.println("Son");
}
这里写法是个死递归。
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:(大概就是报错什么的,英文考题,没太看明白)
这里应该报个什么错误?
s.Fun();
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)
…………………………
sdg();
}
public static void main(String[] args) {
sdg();
}