2013-05-28 126 views
0

只是寻求确认。静态嵌套类中的方法是隐式静态的吗?

public class Indeed{ 
    public static class Inner implements Runnable{ 
     public void run() 
    { 
     System.out.println("Indeed"); 
    } 

    } 
    public static void main (String []args) 
    { 
    Indeed.Inner inner = new Indeed.Inner(); 
    inner.run(); 
    } 
} 

正如你可以在上面的代码中看到,我可以声明public void run()未声明的静态。我想这是隐含的。不是吗?

还有一个问题相关:为什么我不能使用该方法运行如下:Indeed.Inner.run();它毕竟是静态的,应该不需要实例化内部成员呢? (我知道我错了,因为它不会编译,如果我这样做,但我想知道为什么)。

在此先感谢。

+1

好像你不知道静态类是什么。 –

+0

我想,静态修饰符不会做你期望的“class”。 – Fildor

+1

[相关问题](http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) – Supericy

回答

1

静态类只是一个常规类,实际上比非静态类更重要。

静态嵌套类和顶级类之间的区别只是访问范围:静态类可以访问其封闭类的私有成员。

一旦你清楚了,你就不需要问你在这里问的问题。

2

不,run()是静态类Inner的实例方法。一个static(内部)类可以使用没有封闭父实例的类的实例。当你做Indeed.Inner inner = new Indeed.Inner();时,你正在创建一个静态类的实例,并且你在这个实例上调用它的run()方法。

4

正如你可以在上面的代码中看到,我可以声明公共无效的run()未声明的静态。我想这是隐含的。不是吗?

一个问题相关:为什么我不能使用该方法运行如下:Indeed.Inner.run();

因为它不是静态的。


static class仅适用于内部类,你可以通过它包围类为Indeed.Inner指向一个静态类。

这与非静态内部类不同,您需要一个封闭类的实例来创建同一个类的实例。例如:

Indeed.Inner inner = new Indeed().new Inner(); 
0

静态内部类

public static class Inner implements Runnable 

意味着你可以创建它们的实例,而无需创建外类的实例(Indeed

Indeed.Inner inner = new Indeed.Inner(); 

为什么我不能使用如下方法运行:Indeed.Inner.run()?

run方法是通过默认不是静态。直接调用Indeed.Inner.run(),你需要做run()方法static

+0

'静态内部类'是一个矛盾的词汇。 [“内部类是一个嵌套类,不明确或隐式地声明为静态。”](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1 0.3)。 – EJP

相关问题