2013-09-24 53 views
0
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”,因为静态方法不会覆盖。覆盖静态内部类的静态方法的Stackoverflow错误

+0

您正在递归调用'display()'。 –

回答

7

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

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

所以,当你调用这一行,静态类型为Outers.Inner1,因此它调用的显示方法是这个类的一部分,它重复地调用它自己(导致StackOverflowError)。

+1

“静态类型”表示编译器所看到的变量类型 - 不是对象的运行时类型,因为它与非静态方法一样。 –

1

静态方法不是多态调用的!

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

0
  1. 静态方法不能被子类覆盖
  2. 静态方法应该被称为与不类与对象,即使你使用的对象,但它仍然要使用对象的类型。
+0

实际上你可以'override'(定义一个具有相同签名的方法),但是基类中的方法将被调用。 –