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

35

我正在开发一个Android应用程序,但遇到了一些问题,我一直在收到这个错误:

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

在遵循这个答案指引之后出现了这种情况。下面是我拥有的代码:

package com.package.name;

/* Imports were here */

public static class FavsPopupFragment extends SherlockDialogFragment {

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

错误出现在类名上。我不明白为什么这样做不起作用,请帮忙解决。谢谢。


1
在这种情况下,您必须确保或强制自己将FavsPopupFragment放入另一个类中。 - Sanjay T. Sharma
我看这个问题的原因是因为我来自C#/.Net,那里你可以有静态顶级类。尽管事实证明,“静态”在这两种技术中意味着两种不同的东西。 - RenniePet
9个回答

65

你不能创建一个顶层的静态类,这就是编译器试图告诉你的。同时请看一下这里的答案,了解为什么会出现这种情况。概括来说:

静态的含义是该类的实例可以独立存在。或者反过来说:非静态内部类(=实例内部类)没有外部类的实例就无法存在。由于顶层类没有外部类,因此它只能是静态的。

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


9

正如先前的回答所述,您不能在顶级类中使用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
  • static 可以在内部类级别使用。顶层不能是 static,如前所述,只有 publicabstractfinal 是允许的。

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


1

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

对于类 FavsPopupFragment;仅允许使用 public、abstract 和 final 关键字。


1

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


1

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

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

额外信息

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

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


1

1. static 不能在 包级别 使用。

2. static 可以在 类级别 使用。

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


0

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

1) public

2) default

3) abstract

4) final

5) strictfp.

原因:顶级类

由于 static 关键字用于提供内存和执行逻辑而不创建对象,因此外部类不直接具有值逻辑,所以静态关键字不允许用于外部类,特别是上述不能在包级别使用 static。它仅在类级别内使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接