Java 重写静态内部类的静态方法时发生Stackoverflow错误
上面的程序给出了stackoverflow错误。请解释为什么它不显示“Inner1”,因为静态方法不重写。执行的静态方法基于静态类型,而不是实例类型:Java 重写静态内部类的静态方法时发生Stackoverflow错误,java,class,static,inner-classes,Java,Class,Static,Inner Classes,上面的程序给出了stackoverflow错误。请解释为什么它不显示“Inner1”,因为静态方法不重写。执行的静态方法基于静态类型,而不是实例类型: Outers.Inner1 in=新的Outers.Inner2() 因此,当您调用此行时,静态类型为Outers.Inner1,因此它调用作为该类一部分的display方法,该方法会重复调用自身(导致stackoverflowerr)静态方法不会以多态方式调用 这将导致方法display一次又一次地调用自身,直到出现堆栈溢出错误。此外,请参见此
Outers.Inner1 in=新的Outers.Inner2()代码>
因此,当您调用此行时,静态类型为Outers.Inner1
,因此它调用作为该类一部分的display方法,该方法会重复调用自身(导致stackoverflowerr
)静态方法不会以多态方式调用
这将导致方法display一次又一次地调用自身,直到出现堆栈溢出错误。此外,请参见此问题:
静态方法不能被子类重写
静态方法应该使用类而不是对象来调用,即使您使用对象,它仍然将使用对象的类型
您正在递归调用display()
“Static type”表示编译器看到的变量类型,而不是对象的运行时类型,就像使用非静态方法一样。实际上,您可以重写
(定义具有相同签名的方法),但将调用基类中的方法。
public class StaticInnerClass {
public static void main(String[] args) {
//Outers out=new Outers();
Outers.Inner1 in=new Outers.Inner2();
in.display();
}
}
class Outers
{
static class Inner1
{
static void display()
{
display();
System.out.println("Inner1");
}
}
static class Inner2 extends Inner1
{
static void display()
{
System.out.println("Inner2");
}
}
}