Illegal modifier error for static class

2019-01-26 03:15发布

问题:

I'm developing an android application but have hit a bit of a brick wall, I keep getting the error:

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

This happened after following this answer to another SO question. Here is the code that I have:

package com.package.name;

/* Imports were here */

public static class FavsPopupFragment extends SherlockDialogFragment {

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

The error appears on the class name. I dont understand why this wont work, please help. Thank you.

回答1:

You can't create a top level static class; that's what the compiler is trying to tell you. Also have a look at the answer here as to why this is the case. The gist is:

What the static boils down to is that an instance of the class can stand on its own. Or, the other way around: a non-static inner class (= instance inner class) cannot exist without an instance of the outer class. Since a top-level class does not have an outer class, it can't be anything but static.

Because all top-level classes are static, having the static keyword in a top-level class definition is pointless.



回答2:

As the previous answers stated, you can't use the static keyword in top level classes. But i wonder, why did you want it to be static?

Let me show you how a static / non static inner class is used in an example:

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

And from a completely different class:

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


回答3:

A top-level class is by definition already top-level, so there is no point in declaring it static; it is an error to do so. The compiler will detect and report this error.



回答4:

Remove static from class definition. Only nested classes can be static.

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



回答5:

I don't think you can create instances of a static class using the new keyword. This is a fragment anyway, so it probably should not be static anyway.



回答6:

1. static canNOT be used at Package level.

2. static is possible within the Class level.

3. But you can still use static on a class, when the class is an inner class, ie. (static inner class), commonly known as Top level class.



回答7:

You cant use static modifier for top level classes, though there can be nested classes which can be modified with static keyword.

In this case either you need to remove the static modifier, or make sure this class nested into another top level class.

Extra info

There's no such thing as a static class. The static modifier in this case (static nested) says that the nested class is a static member of the outer class. That means it can be accessed, as with other static members, without having an instance of the outer class.

Just as a static method does not have access to the instance variables and nonstatic methods of the class, a static nested class does not have access to the instance variables and nonstatic methods of the outer class



回答8:

  • static can be used at the inner class level. Top level can't be static, as said before, only public, abstract & final are permitted.

  • static is mainly used inside class level for methods and variables.