タイトルが示唆しているように、なぜ静的クラスに静的メンバーしか持たないのかを理解したいと思います。私はそれがすべてのプログラミング言語で同じであることを願っています。それで、すべての言語で説明が同じになると私は信じています。なぜ静的クラスは静的メンバーのみを持つことができますか?
答えて
スタティッククラスはインスタンス化できないため、インスタンスは存在しません。非スタティックメンバーには、そのクラスのインスタンスがアクセスする必要があります。静的クラスはインスタンスを持つことができないので、静的でないメンバーにアクセスすることはできません。
インスタンスメソッドが呼び出されることはありませんでしたので、そのための静的クラスは静的メンバーのみおそらく
を持つことができます。
静的でないメンバーを静的なクラスに配置すると、静的なクラスではありません。 (静的クラスをインスタンス化することはできません。非静的メンバーを持つためには、それらのメンバーを呼び出すクラスのインスタンスを作成できなければなりません)。
それを見るには別の方法として、クラスを静的としてマークすることで、静的メソッドをそのクラスに置かないようにコンパイラに意図的に求めています。これは設計上の決定であり、コンパイラは自分自身に従うことを確認するのに役立ちます設計。
静的クラスをインスタンス化することはできません。したがって、非静的メンバーにアクセスすることはできません。
静的メンバーを混在させて一致させる場合は、クラスを静的にしないでください。
これは設計上の決定ではなく、論理的なものです。
静的クラスは、インスタンス化できないクラスです。つまり、そのクラスのタイプのオブジェクトを作成することはできません。
非スタティックメンバーは、クラスの特定のインスタンスに関連付けられています。これらのデータには、のデータが含まれています。には、そのクラスタイプのオブジェクトが1つあります。
静的クラスに非静的メンバーが含まれている場合、その静的クラスの型のオブジェクトを決してインスタンス化できないため、そのデータにアクセスしたり、そのメソッドを呼び出すことはできません。代わりに、のstaticメンバーをクラスの静的インスタンスから直接呼び出すことができます。
ただし、には、静的メンバーを含む非静的クラスがあります。これにより、そのクラスのオブジェクトをインスタンス化せずに、データにアクセスしたり、静的メンバーとして公開されているメソッドを呼び出すことができます。ただし、は、そのクラスの型のオブジェクトをインスタンス化し、非静的(またはインスタンス)メンバーにアクセスできます。たとえば、クラスCircle
の場合は、CalculateArea
関数とPI
フィールドのような静的メンバーを持つことができます。これらのメンバーは、サークルであるという事実によって、一般にすべてのサークルに適用されます。しかし、特定のインスタンスに関連付けられた非静的メンバーを持つこともできます。特定の円オブジェクトが記述されているため、このクラスのインスタンスに関連付けられています。フィールドはDiameter
とCircumference
です。また、その特定のインスタンスの非静的フィールドに格納されているデータを使用すると、円の面積を計算する非静的関数を持つこともできます。
これが関連しているかどうかはわかりませんが(少なくともC#.net 4.0では)、静的クラスに非静的メンバーを含む非静的クラス定義を含めることができます。だから、ネストされた型はmemberと見なされるので、静的でないメンバーを静的なクラスに追加できるようです。
例:
public static class MyClass
{
/// <summary>
/// This non-static class is accessible and able to be instantiated through the
/// static class MyClass.
/// </summary>
public class Type1
{
public String prop1 { get; set; }
public String funct1(String result)
{
return result;
}
}
/// <summary>
/// This function is inaccessible since it requires an instance of MyClass.
/// It will also cause a compile error.
/// </summary>
/// <returns></returns>
public String nonStaticFunc()
{
return "aString";
}
/// <summary>
/// This function is accessible through the MyClass type because it is also static
/// and therefore does not require a class instance.
/// </summary>
/// <returns></returns>
public static String staticFunc(String str)
{
return str;
}
}
あなたが見ることができるように、静的MyClassクラスを使用するためにインスタンス化されなければならない非静的クラス定義のType1を持っています。 MyClassの静的関数staticFuncは、インスタンスにアクセスする必要はありません。
//Valid operations
String result = MyClass.staticFunc("result"); //No class instance.
MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type.
someObj.prop1 = someObj.funct1("hi");
- 1. クラスはなぜ静的メンバーを持つことが許されますが、非静的メンバーは持てませんか?
- 2. 静的メソッドのみを持つクラスは静的であるべきですか?
- 3. 内部状態の静的メンバーのみを持つクラス
- 4. 静的ライブラリの静的メンバー
- 5. クラスと派生クラスのインスタンスは、非静的メソッドを介して間接的にクラスの静的メンバーを変更することができます。#
- 6. 静的クラスと静的メソッド
- 7. 静的内部クラスは、外部クラスのすべての静的データメンバーと静的メンバー関数にどのようにアクセスできますか?
- 8. 静的クラスに非静的メソッドと変数を使用できないのはなぜですか?
- 9. 外部クラスを静的として定義し、内部静的クラスを囲むことはできますか?
- 10. 静的初心者:静的なクラス/メソッド内の静的でない変数は静的なことを暗示していますか?
- 11. メンバー関数内で静的変数を作成できますか?そのクラスのインスタンス内では静的変数のみが使用できますか?
- 12. QtのQIconのインスタンスを自分のクラスの静的メンバーとして持つことは可能ですか?
- 13. System.Randomクラスが静的でないのはなぜですか?
- 14. クラスに静的なconstexprメンバーのインスタンスはありませんか?
- 15. 静的メンバーのガベージコレクション
- 16. 非静的メンバー関数は静的メンバー関数またはデータにアクセスできますか?
- 17. インスタンスのみを持つクラスの静的メソッドを呼び出す
- 18. 静的ポインタを持つC++クラス
- 19. 静的メンバーとブーストシリアル化
- 20. 静的メンバー関数とスレッドセーフ
- 21. 静的メンバー関数
- 22. Boost.Bind非静的メンバー
- 23. 静的クラスを持つビューに動的クラスを追加する
- 24. std :: forward_listメンバーは静的として実装できますか?
- 25. 内部クラスが静的メンバーを宣言できないのはなぜですか?
- 26. Mockito:、私はmockitoから何かを(静的または非静的メソッド)模擬することができません静的&非静的メソッド
- 27. これらのプライベートな静的メンバーはスレッドセーフですか?
- 28. 静的メソッドと非静的メソッドを同じクラスに持つのは間違っていますか?
- 29. このコレクションイニシャライザが静的になるのはなぜですか?
- 30. C++の静的メソッドのみを持つクラスの利点
あなたはこれを考えましたか?静的クラス内の非静的メンバーを許可する目的は何でしょうか? – mpen
私はルール '静的クラスは非静的メンバーを持つことはできません'を知っています。しかし、私は理由を理解したかった。実際に私は、静的なクラスとそのメンバーがどのように格納されるか、非静的なクラスとメンバがどのように格納されるかというように、メモリの面でもっと不気味な答えを期待していました。 :) – NLV