Подтвердить что ты не робот

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

Я разрабатываю приложение для Android, но ударил немного кирпичной стены, я все время получаю ошибку:

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

Это произошло после следующего этого ответа на другой вопрос SO. Вот код, который у меня есть:

package com.package.name;

/* Imports were here */

public static class FavsPopupFragment extends SherlockDialogFragment {

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

1. static НЕ МОЖЕТ использовать Package level.

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

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

Ответ 7

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

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

Ответ 8

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