【问题标题】:Why outer classes are not static in java? [duplicate]为什么外部类在java中不是静态的? [复制]
【发布时间】:2013-09-15 07:00:58
【问题描述】:

在 java 中,外部类可以是公共的、最终的、默认的或抽象的。 为什么不喜欢静态

public static class MyClass{}

【问题讨论】:

  • 相对于类的静态成员,您希望静态类具有什么语义?
  • 因为它是多余的,没有表达任何内容,并引发了错误的期望,即省略“静态”一词会改变含义。
  • 请阅读您的问题的答案,为什么不能将 Java 类声明为静态?在stackoverflow.com/a/40015089/2078093

标签: java class static nested-class


【解决方案1】:

外部类已经是隐式静态的。

非静态嵌套类(=内部类)意味着内部类隐式地引用了它的父类。

这就是为什么对于嵌套类,您可以区分静态和非静态。这对外部类没有意义。

这里有一个例子来理解静态/非静态嵌套类之间的区别。你应该明白为什么它在外部类中没有意义。

public class MyClass {

  private String anAttributeOfMyClass;

  private /*static*/ class MyInnerClass {

    public void foo() {
      /*
       * Here, I can access the attribute of the parent class
       * because I implicitly have a reference to it.
       * Try to make the nested class static an see the difference.
       */
      anAttributeOfMyClass.trim();
    }
  }

}

【讨论】:

  • 您能详细说明一下吗?这对我来说是新的
  • 正如您所描述的那样,它与无法实例化的其他语言(如 C#)中的静态类无关。
  • 一个接口方法是隐式的公共和抽象的,但即使我们将它们声明为公共和抽象的,它也是有效的。那么,如果外部类是隐式静态的,为什么将其声明为静态是不正确的呢?我不确定我是否遵循这个答案。
  • @Prasad 是的。如果你明确声明接口方法为公共的,Sonar 会抱怨它。但是在 java 8 中,您也许可以在接口中编写完整的方法,我想能够选择可见性会很有用。
  • @Prasad 摘要的注释相同。在 Java 8 接口中,您将能够在 abstractdefault 之间进行选择。见blog.hartveld.com/2013/03/…
猜你喜欢
  • 2013-10-04
  • 2013-03-05
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2013-10-25
相关资源
最近更新 更多