【问题标题】:Stackoverflow error in overriding static methods of static inner classes覆盖静态内部类的静态方法时出现 Stackoverflow 错误
【发布时间】:2013-09-24 11:31:03
【问题描述】:
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");
    }
}
}

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

【问题讨论】:

  • 你在递归调用display()

标签: java class static inner-classes


【解决方案1】:

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

Outers.Inner1 in=new Outers.Inner2();

因此,当您调用此行时,静态类型为 Outers.Inner1,因此它会调用属于此类的 display 方法,该方法会重复调用自身(导致 StackOverflowError。)

【讨论】:

  • “静态类型”是指编译器看到的变量类型——而不是对象的运行时类型,就像使用非静态方法一样。
【解决方案2】:

静态方法不会被多态调用!

这将导致方法显示一次又一次地调用自身,直到出现堆栈溢出错误。另外,请参阅这个问题:Polymorphism and Static Methods

【讨论】:

    【解决方案3】:
    1. 静态方法不能被子类覆盖
    2. 静态方法应该用Class而不是对象调用,即使你使用对象,它仍然会使用对象的类型。

    【讨论】:

    • 其实可以override(定义一个签名相同的方法),但是会调用基类中的方法。
    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2019-03-24
    • 2011-09-16
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多