web-dev-qa-db-ja.com

静的クラスの無効な修飾子エラー

私は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;
    }
}

エラーはクラス名に表示されます。これがうまくいかない理由がわかりません。助けてください。ありがとうございました。

25
JDx

トップレベルの静的クラスを作成することはできません。それがコンパイラがあなたに伝えようとしていることです。また、答えを見てください here についてwhyこれが事実です。要点は次のとおりです。

静的なものは、クラスのインスタンスが単独で立つことができるということです。または、他の方法:非静的内部クラス(=インスタンス内部クラス)は、外部クラスのインスタンスなしでは存在できません。最上位クラスには外部クラスがないため、静的以外のものにはなりません。

すべてのトップレベルクラスは静的であるため、トップレベルクラス定義にstaticキーワードを含めることは無意味です。

51

前の回答で述べたように、トップレベルクラスでは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
    }
}
6
Balázs Édes

トップレベルのクラスは、定義によりすでにトップレベルであるため、静的と宣言する意味はありません。そうするのはエラーです。コンパイラはこのエラーを検出して報告します。

2
Andrew Glukhoff

クラス定義から静的を削除します。ネストされた classes のみが静的になります。

favsPopupFragmentクラスの場合。公開、要約、最終のみ許可されています

1
kosa

Newキーワードを使用して静的クラスのインスタンスを作成できるとは思わない。とにかくこれはフラグメントなので、おそらく静的であるべきではありません。

1
Karakuri

staticキーワードで変更できるネストされたクラスが存在する場合がありますが、トップレベルのクラスにstatic修飾子を使用することはできません。

この場合、静的修飾子を削除するか、このクラスが別の最上位クラスにネストされていることを確認する必要があります。

追加情報

静的クラスのようなものはありません。この場合の静的修飾子(静的ネスト)は、ネストされたクラスが外部クラスの静的メンバーであることを示しています。つまり、他の静的メンバーと同様に、外部クラスのインスタンスを持たずにアクセスできます。

静的メソッドがクラスのインスタンス変数と非静的メソッドにアクセスできないように、静的にネストされたクラスは、外部クラスのインスタンス変数と非静的メソッドにアクセスできません

1
code-jaff

1。staticcanNOTPackage level.で使用できます

2。staticクラスレベル内で可能

しかし、クラスがinner classである場合、まだクラスでstaticを使用できます。 (static inner class)、一般的にはトップレベルクラス。

1
  • staticは、内部クラスレベルで使用できます。前に述べたように、トップレベルをstaticにすることはできません。publicabstractおよびfinalのみが許可されます。

  • staticは、主にメソッドと変数のクラスレベル内で使用されます。

1
Jyoti Prakash