为什么静态类在Java中是非法的?

2022-09-01 09:24:26

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

错误将显示在类名上。我不明白为什么这不起作用,请帮忙。谢谢。


答案 1

您无法创建顶级静态类;这就是编译器试图告诉你的。也看看这里的答案,为什么会这样。要点是:

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

由于所有顶级类都是静态的,因此在顶级类定义中使用 static 关键字是毫无意义的。


答案 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
    }
}

推荐