【问题标题】:Why is a static class illegal in Java?为什么静态类在 Java 中是非法的?
【发布时间】:2012-08-03 15:09:02
【问题描述】:

我正在开发一个 Android 应用程序,但遇到了一些问题,我不断收到错误消息:

Illegal modifier for the class FavsPopupFragment; only public, abstract & final are permitted

这发生在关注 this answer 到另一个 SO 问题之后。这是我的代码:

package com.package.name;

/* Imports were here */

public static class FavsPopupFragment extends SherlockDialogFragment {

    static FavsPopupFragment newInstance() {
        FavsPopupFragment frag = new FavsPopupFragment();
        return frag;
    }
}

错误出现在类名上。我不明白为什么这不起作用,请帮助。谢谢。

【问题讨论】:

  • 在这种情况下,您必须确保或强迫自己将FavsPopupFragment 放入另一个类中。
  • 对我来说,我正在看这个问题的原因是我来自 C#/.Net,在那里你可以拥有静态顶级类。尽管事实证明“静态”在两种技术中意味着两种不同的东西。

标签: java static static-classes


【解决方案1】:

您不能创建顶级静态类;这就是编译器试图告诉你的。另请查看here 的答案,了解为什么会出现这种情况。要点是:

静态归结为类的实例可以 独立存在。或者,反过来:非静态内部类 (=实例内部类)没有外部实例就不能存在 班级。由于顶级类没有外部类,它不能 绝不是静态的。

因为所有顶级类都是静态的,所以在 顶级类定义毫无意义。

【讨论】:

    【解决方案2】:

    正如前面的答案所述,您不能在顶级类中使用 static 关键字。但我想知道,你为什么希望它是静态的?

    让我向您展示如何在示例中使用静态/非静态内部类:

    public class A
    {
        public class B{}
    
        public static class C{}
    
        public static void foo()
        {
            B b = new B(); //incorrect
    
            A a = new A();
            A.B b = a.new B(); //correct
    
            C c = new C(); //correct
        }
        public void bar()
        {
            B b = new B();
            C c = new C(); // both are correct
        }
    }
    

    而且来自一个完全不同的班级:

    public class D
    {
        public void foo()
        {
            A.B b = new A.B() //incorrect
    
            A a = new A()
            A.B b = a.new B() //correct
    
            A.C c = new A.C() //correct
        }
    }
    

    【讨论】:

      【解决方案3】:

      1. static 不能用于Package level.

      2.static可能在类级别内。

      3.但是当类是inner class 时,您仍然可以在类上使用静态,即。 (static inner class),俗称顶级类。

      【讨论】:

        【解决方案4】:

        根据定义,顶级类已经是顶级的,因此将其声明为静态没有意义;这样做是错误的。编译器会检测并报告这个错误。

        【讨论】:

          【解决方案5】:

          从类定义中删除静态。只有嵌套的classes 可以是静态的。

          对于 FavsPopupFragment 类;只有 public、abstract 和 final 是 允许

          【讨论】:

            【解决方案6】:

            我认为您不能使用 new 关键字创建静态类的实例。无论如何,这是一个片段,所以它可能不应该是静态的。

            【讨论】:

              【解决方案7】:

              您不能对顶级类使用static 修饰符,尽管可以使用static 关键字修改嵌套类。

              在这种情况下,您需要删除静态修饰符,或者确保该类嵌套到另一个顶级类中。

              额外信息

              没有静态类这样的东西。这里的静态修饰符 case (static nested) 表示嵌套类是外部类的静态成员。 这意味着它可以像其他静态成员一样被访问,而无需 有一个外部类的实例。

              就像静态方法不能访问实例变量一样 和类的非静态方法,静态嵌套类不 可以访问实例变量和非静态方法 外部类

              【讨论】:

                【解决方案8】:
                • static 可用于内部类级别。顶级不能是static,如前所述,只允许publicabstractfinal

                • static主要用于类内部的方法和变量。

                【讨论】:

                  【解决方案9】:

                  顶级类支持的访问修饰符如下:

                  1) 公开

                  2) 默认

                  3) 摘要

                  4) 最终

                  5) strictfp。

                  原因:顶级课程

                  因为static关键字是为了提供内存和执行逻辑而不创建对象,一个类没有直接的值逻辑,所以外部类不允许使用static关键字,主要是上面提到的static不能使用在包级别。它只在 Class 级别中使用。

                  【讨论】:

                    猜你喜欢
                    • 2021-10-01
                    • 2012-05-26
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-11-16
                    • 2016-12-29
                    • 2015-11-13
                    • 2011-07-11
                    相关资源
                    最近更新 更多