Reputation: 2655
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 don't understand why this won't work, please help. Thank you.
Upvotes: 37
Views: 92867
Reputation: 13816
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?
An example of how static/non static classes can be instantiated:
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
}
}
Upvotes: 9
Reputation: 160
The access modifier supported for top level are class are as follows :
1) public
2) default
3) abstract
4) final
5) strictfp.
Reason: Top level class
Because the static keyword is meant for providing memory and executing logic without creating Objects, a class does not have a value logic directly, so the static keyword is not allowed for outer class and mainly as mentioned above static can't be used at Package level. It only used within the Class level.
Upvotes: 0
Reputation: 916
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.
Upvotes: 2
Reputation: 4027
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.
Upvotes: 2
Reputation: 9330
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
Upvotes: 1
Reputation: 33544
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.
Upvotes: 1
Reputation: 38605
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.
Upvotes: 1
Reputation: 66677
Remove static from class definition. Only nested classes can be static.
for the class FavsPopupFragment; only public, abstract & final are permitted
Upvotes: 1
Reputation: 23248
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.
Upvotes: 65