静态类的非法修饰符错误

时间:2012-08-06 15:57:49

标签: java android static

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

错误出现在班级名称上。我不明白为什么这不起作用,请帮忙。谢谢。

8 个答案:

答案 0 :(得分:47)

您无法创建顶级静态类;这就是编译器试图告诉你的。另请查看答案here,了解为何就是这种情况。要点是:

  

静态归结为类的实例可以   站在自己的立场上。或者,反过来说:一个非静态的内部类   (=实例内部类)在没有外部实例的情况下不能存在   类。由于顶级类没有外部类,因此不能   不过是静止的。

     

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

答案 1 :(得分:5)

如前所述,您不能在顶级课程中使用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
    }
}

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

  

为FavsPopupFragment类;只有公共的,抽象的和决赛是   允许

答案 4 :(得分:1)

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

答案 5 :(得分:1)

您无法将static修饰符用于顶级类,但可以使用static关键字修改嵌套类。

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

额外信息

  

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

     

正如静态方法无法访问实例变量一样   和类的非静态方法,静态嵌套类不会   有权访问实例变量和非静态方法   外层

答案 6 :(得分:1)

1。 static 不能Package level.使用

在课程级别

2。 static

3。但是当类为inner class时,你仍然可以在类上使用静态,即。 (static inner class),通常称为顶级课程。

答案 7 :(得分:1)

  • static可以在内部类级别使用。如上所述,最高级别不能是static,只能是publicabstract&允许final

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