Java 重写静态内部类的静态方法时发生Stackoverflow错误

Java 重写静态内部类的静态方法时发生Stackoverflow错误,java,class,static,inner-classes,Java,Class,Static,Inner Classes,上面的程序给出了stackoverflow错误。请解释为什么它不显示“Inner1”,因为静态方法不重写。执行的静态方法基于静态类型,而不是实例类型: Outers.Inner1 in=新的Outers.Inner2() 因此,当您调用此行时,静态类型为Outers.Inner1,因此它调用作为该类一部分的display方法,该方法会重复调用自身(导致stackoverflowerr)静态方法不会以多态方式调用 这将导致方法display一次又一次地调用自身,直到出现堆栈溢出错误。此外,请参见此

上面的程序给出了stackoverflow错误。请解释为什么它不显示“Inner1”,因为静态方法不重写。

执行的静态方法基于静态类型,而不是实例类型:

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");
        }
    }
    }