Java 静态类的非法修饰符错误

Java 静态类的非法修饰符错误,java,android,static,Java,Android,Static,我正在开发一个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

我正在开发一个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;
    }
}

错误出现在类名上。我不明白为什么这行不通,请帮忙。谢谢。

您不能创建顶级静态类;这就是编译器想要告诉你的。还可以看看为什么会出现这种情况的答案。要点是:

静态的本质是类的一个实例可以 自立。或者,反过来说:一个非静态的内部类 没有外部类的实例,(=实例内部类)不能存在 班级。因为顶级类没有外部类,所以它不能 不能是静止的

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


从类定义中删除static。只有嵌套才能是静态的

对于类FavsPopupFragment;只有公共的、抽象的和最终的是 允许的


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

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

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

额外信息

没有静态类这样的东西。此对话框中的静态修饰符 case(staticnested)表示嵌套类是外部类的静态成员。 这意味着可以像访问其他静态成员一样访问它,而无需 具有外部类的实例

正如静态方法不能访问实例变量一样 和类的非静态方法,静态嵌套类则不会 可以访问的实例变量和非静态方法 外层阶级


1。
静态
不能在
包级别使用。

2.
静态
在类级别内是可能的。


3.但当类是
内部类时,仍然可以在类上使用static,即
(静态内部类)
,通常称为顶级类。

正如前面的答案所述,不能在顶级类中使用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
    }
}
  • static
    可以在内部类级别使用。顶层不能是
    静态的
    ,如前所述,只允许
    公共的
    抽象的
    最终的

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


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

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

1)公开

2)默认值

3)摘要

4)决赛

5)严格限制

原因:顶级课程


由于static关键字用于提供内存和执行逻辑,而不创建对象,因此类没有直接的值逻辑,因此外部类不允许使用static关键字,主要如上所述,static不能在包级别使用。它只在类级别内使用。

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