Недопустимая ошибка модификатора для статического класса

Я разрабатываю приложение для 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; } } 

Ошибка в имени класса. Я не понимаю, почему это не работает, пожалуйста, помогите. Спасибо.

Solutions Collecting From Web of "Недопустимая ошибка модификатора для статического класса"

Вы не можете создать статический класс верхнего уровня; Вот что компилятор пытается вам рассказать. Также рассмотрите здесь ответ, почему это так. Суть заключается в следующем:

То, что статично сводится к тому, что экземпляр класса может стоять сам по себе. Или, наоборот: нестатический внутренний класс (= внутренний класс экземпляра) не может существовать без экземпляра внешнего класса. Поскольку класс верхнего уровня не имеет внешнего класса, он не может быть ничего, кроме статического.

Поскольку все классы верхнего уровня являются статическими, наличие ключевого слова static в определении класса верхнего уровня бессмысленно.

Как указывалось в предыдущих ответах, вы не можете использовать статическое ключевое слово в классах верхнего уровня. Но мне интересно, почему вы хотите, чтобы он был статичным?

Позвольте мне показать вам, как статический / нестатический внутренний класс используется в примере:

 public class A { public class B{} public static class C{} public static void foo() { B b = new B(); //incorrect A a = new A(); AB 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() { AB b = new AB() //incorrect A a = new A() AB b = a.new B() //correct AC c = new AC() //correct } } 

Удалите статику из определения класса. Только вложенные классы могут быть статическими.

Для класса FavsPopupFragment; Разрешены только публичные, абстрактные и окончательные

Я не думаю, что вы можете создавать экземпляры статического класса с использованием нового ключевого слова. В любом случае это фрагмент, поэтому он, вероятно, не должен быть статическим.

1. static не может использоваться на Package level.

2. static возможна на уровне класса.

3. Но вы все равно можете использовать static в классе , когда класс является inner class , т.е. (static inner class) , обычно известный как класс верхнего уровня.

Вы не можете использовать static модификатор для классов верхнего уровня, хотя могут быть вложенные классы, которые могут быть изменены с помощью static ключевого слова.

В этом случае вам нужно удалить статический модификатор или убедиться, что этот класс вложен в другой класс верхнего уровня.

Дополнительная информация

Нет такой вещи, как статический класс. Статический модификатор в этом случае (статический вложенный) говорит, что вложенный класс является статическим членом внешнего класса. Это означает, что к нему можно получить доступ, как и к другим статическим членам, без экземпляра внешнего класса.

Так же, как статический метод не имеет доступа к переменным экземпляра и нестатическим методам класса, статический вложенный класс не имеет доступа к переменным экземпляра и нестатическим методам внешнего класса

  • static может использоваться на внутреннем уровне класса. Верхний уровень не может быть static , как было сказано ранее, разрешены только public , abstract и final .

  • static в основном используется внутри класса для методов и переменных.

Класс верхнего уровня по определению уже является верхним уровнем, поэтому нет смысла объявлять его статичным; Это ошибка. Компилятор обнаружит и сообщит об этой ошибке.