我正在开发一个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;
}
}
错误出现在班级名称上。我不明白为什么这不起作用,请帮忙。谢谢。
答案 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
,只能是public
,abstract
&允许final
。
static
主要在类级别内用于方法和变量。