8

次の場合の違いと、それぞれをどこで使用するのか説明してもらえますか?皆さんありがとう

class A{
  static public void methodA()
}

static class B{
  static public void methodB()
}

static class C{
  public void methodC()
}

編集:こんにちはすべての答えに感謝します。多分私は十分に明確ではありませんでした。クラスBとCは、内部クラスでない限り静的と宣言できないことを認識しています。私はあなたの答えで彼らが内部クラスであると仮定してください。いつ静的に宣言するのか、いつメソッドを静的に宣言するのかを知りたいです。非静的クラスの静的メソッドは、どこからでも呼び出すことができることを意味し、通常、オブジェクトに固有ではない一般的な操作を実行することを知っています。しかし、なぜ静的クラスを宣言するのでしょうか?あなたが私の編集を読み直して、最も説明的な答えを受け入れた後、私はあなたの答えをもう一度チェックします

4

4 に答える 4

4

静的修飾子は、静的フィールドまたはクラス変数を宣言するために使用されます

それらは、オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の1つの固定された場所にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。

出典:「インスタンスとクラスのメンバーについて」

また、Javaは静的変数とメソッドの両方をサポートしていることに注意してください。したがって、これを実行すると、最初のクラスは正しくコンパイルされますが、他の2つは失敗します。

例を挙げると、次のようになります。

class A{
    public static int STATIC_VALUE = 1; // is a valid static variable

    public static void method1(){ 
        //is a valid static method
    }

    /**
    * Is a valid static inner class
    */
    static class innerClassB{

    }
}

しかし、なぜ静的クラスを宣言するのでしょうか?

それをしたいと思う理由にはいくつかの理由があります。たとえば、このJavaチュートリアルから:

静的にネストされたクラスは、他のトップレベルクラスと同じように、その外部クラス(および他のクラス)のインスタンスメンバーと対話します。事実上、静的にネストされたクラスは、動作上、パッケージ化の便宜のために別のトップレベルクラスにネストされたトップレベルクラスです。

この良い例は、 HashMapクラスstatic class Entry<K,V> implements Map.Entry<K,V>のような場所で使用されています。

Entryクラスの存在は、HashMapがコンテンツとして格納されているキーと値のペアを格納/取得する方法の機能と密接に関連しています。ご覧のとおり、Entryクラスは、動作上はトップレベルクラスと同等ですが、HashMap実装にのみ機能を提供します。したがって、HashMap定義自体の一部としてパッケージ化することは理にかなっています。

private static class Entry<E>LinkedListの実装で も同様の使用法を見つけることができます。

私が考えることができるもう1つの理由は、ホワイトボックステストの方法です。内部静的クラスは外部クラスのプライベートおよび保護された静的変数/メソッドにアクセスできるため、これを使用して外部クラスの内部状態をテストできます。これを汚いと考える人もいるかもしれませんが、それが役立つ場合もあります

私の意見では、静的内部クラスは主に便宜上のものであり、通常は設計原則に基づいています。

于 2012-09-30T04:19:35.763 に答える
1

クラスAには、静的なクラスレベルのメソッドがあります。どのクラスインスタンスにも関連していません。

クラスBとCは違法であり、静的なクラスを定義することはできません。

編集:HFoEが言ったように、BまたはCは内部クラスであれば機能します。その場合、外部クラスのインスタンス属性にアクセスできなくなります。

于 2012-09-30T04:16:17.983 に答える
1

ここには基本的に2つの用途がありstaticます。

  • staticクラスでは、ネストされたクラスでのみ使用できます。つまり、他のクラス内で宣言された名前付きクラス。これは、ネストされたクラスのインスタンスに、それを囲む外部クラスの親インスタンスがないことを意味します。

  • staticメソッド上とは、メソッドが含まれているクラスのインスタンスに適用されないことを意味します。つまり、メソッドの本体はを参照できませんthis


これは、との宣言がB外部Cクラスで宣言されていないため、記述されているとおりに無効であることを意味します。

(別の答えは、トップレベルのクラスは暗黙的に静的であると言っています。ある意味ではそれは真実ですが、別の見方をすれstaticば、トップレベルのクラスには無意味です。いずれにせよ、Java言語では単に宣言することはできません。トップレベルクラスとしてstatic。これはコンパイルエラーです。)

于 2012-09-30T04:19:25.830 に答える
0

すべての外部レベルのクラスは静的ですが、それらの静的な予約語について言及することはできないため、BとCは外部レベルのクラスとしては違法です。

ただし、すべてのケースは有効な内部クラスです。この場合、Aはメンバー内部クラスですが、BとCは静的内部クラスです(通常のクラスと同等)。

AとBには静的メソッドが含まれていますが、Cには含まれていません。

于 2012-09-30T04:20:08.637 に答える