31

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

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

这发生在对另一个 SO 问题的回答之后。这是我拥有的代码:

package com.package.name;

/* Imports were here */

public static class FavsPopupFragment extends SherlockDialogFragment {

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

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

4

9 回答 9

61

您不能创建顶级静态类;这就是编译器试图告诉你的。还可以在这里查看答案,了解为什么会这样。要点是:

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

因为所有顶级类都是静态的,所以在顶级类定义中使用 static 关键字是没有意义的。

于 2012-08-06T16:00:24.873 回答
6

正如前面的答案所述,您不能在顶级类中使用 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
    }
}
于 2012-08-06T16:26:49.553 回答
2

1. static 不能用于Package level.

2. 在Class级别内static是可能的。

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

于 2012-08-06T16:11:40.457 回答
2

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

于 2016-12-27T08:24:03.603 回答
1

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

对于 FavsPopupFragment 类;只允许公开、抽象和最终

于 2012-08-06T16:00:26.187 回答
1

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

于 2012-08-06T16:00:41.243 回答
1

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

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

额外信息

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

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

于 2012-08-06T16:06:54.213 回答
1
  • static可以在内部类级别使用。static如前所述,顶级不能是public,只有abstract&final是允许的。

  • static主要用于类级别的方法和变量。

于 2013-03-25T05:55:55.040 回答
0

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

1) 公开的

2) 默认

3) 摘要

4) 最后

5) 严格的fp。

理由:顶级班

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

于 2020-01-20T09:37:43.000 回答