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()而不声明它static。我猜它是隐式完成的。不是吗?

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

提前致谢。

4

5 回答 5

4

正如您在上面的代码中看到的,我可以声明 public void run() 而不声明它是静态的。我猜它是隐式完成的。不是吗?

不。

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

因为它不是静态的。


static class仅对内部类有效,您可以通过其封闭类指向静态类作为Indeed.Inner.

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

Indeed.Inner inner = new Indeed().new Inner();
于 2013-05-28T09:46:18.767 回答
2

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

于 2013-05-28T09:45:43.950 回答
1

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

非静态嵌套类(内部类)可以访问封闭类的其他成员

静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。

于 2013-05-28T09:48:26.620 回答
1

静态类只是一个普通类,实际上比非静态类更是如此。

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

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

于 2013-05-28T09:49:48.750 回答
0

静态内部类

public static class Inner implements Runnable

意味着您可以创建它们的实例,而不必创建外部类 ( Indeed)的实例

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

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

run方法默认不是静态的。要直接调用,还Indeed.Inner.run()需要 makerun()方法static

于 2013-05-28T09:47:28.663 回答