タイトルが示唆しているように、なぜ静的クラスに静的メンバーしか持たないのかを理解したいと思います。私はそれがすべてのプログラミング言語で同じであることを願っています。それで、すべての言語で説明が同じになると私は信じています。なぜ静的クラスは静的メンバーのみを持つことができますか?
答えて
スタティッククラスはインスタンス化できないため、インスタンスは存在しません。非スタティックメンバーには、そのクラスのインスタンスがアクセスする必要があります。静的クラスはインスタンスを持つことができないので、静的でないメンバーにアクセスすることはできません。
インスタンスメソッドが呼び出されることはありませんでしたので、そのための静的クラスは静的メンバーのみおそらく
を持つことができます。
静的でないメンバーを静的なクラスに配置すると、静的なクラスではありません。 (静的クラスをインスタンス化することはできません。非静的メンバーを持つためには、それらのメンバーを呼び出すクラスのインスタンスを作成できなければなりません)。
それを見るには別の方法として、クラスを静的としてマークすることで、静的メソッドをそのクラスに置かないようにコンパイラに意図的に求めています。これは設計上の決定であり、コンパイラは自分自身に従うことを確認するのに役立ちます設計。
静的クラスをインスタンス化することはできません。したがって、非静的メンバーにアクセスすることはできません。
静的メンバーを混在させて一致させる場合は、クラスを静的にしないでください。
これは設計上の決定ではなく、論理的なものです。
静的クラスは、インスタンス化できないクラスです。つまり、そのクラスのタイプのオブジェクトを作成することはできません。
非スタティックメンバーは、クラスの特定のインスタンスに関連付けられています。これらのデータには、のデータが含まれています。には、そのクラスタイプのオブジェクトが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. Javaは、私はいくつかの静的メンバーと静的クラスを持つすべてのインスタンスのリスト
- 6. 静的ライブラリの静的メンバー
- 7. なぜ私はこのような静的メソッド持つ非静的メソッドのC#
- 8. 非静的メンバーの静的メンバー関数
- 9. TypeScript静的メンバーとクラス名を持つ名前空間
- 10. クラスと派生クラスのインスタンスは、非静的メソッドを介して間接的にクラスの静的メンバーを変更することができます。#
- 11. 静的クラスと静的メソッド
- 12. 派生クラスの静的メンバー値からのPython静的メンバー初期化
- 13. 独自の型の静的メンバーを持つクラス
- 14. 新しい演算子を持つクラスの静的メンバー変数
- 15. c#静的メンバーまたは静的コンストラクタとシングルトンの違い
- 16. jsが、私は、静的メソッドを持つクラスを持つクラス
- 17. 静的内部クラスは、外部クラスのすべての静的データメンバーと静的メンバー関数にどのようにアクセスできますか?
- 18. 静的クラスに非静的メソッドと変数を使用できないのはなぜですか?
- 19. 静的メンバー
- 20. 外部クラスを静的として定義し、内部静的クラスを囲むことはできますか?
- 21. 静的初心者:静的なクラス/メソッド内の静的でない変数は静的なことを暗示していますか?
- 22. PHPクラスの静的メンバー状態を維持する方法は?
- 23. メンバー関数内で静的変数を作成できますか?そのクラスのインスタンス内では静的変数のみが使用できますか?
- 24. System.Randomクラスが静的でないのはなぜですか?
- 25. QtのQIconのインスタンスを自分のクラスの静的メンバーとして持つことは可能ですか?
- 26. 静的データメンバーが非静的データメンバーと同じ名前を持つことができないのはなぜですか?
- 27. クラスに静的なconstexprメンバーのインスタンスはありませんか?
- 28. 静的メソッドのみを持つクラス - 列挙型かどうか
- 29. 静的メンバーのガベージコレクション
- 30. 静的メンバー関数が静的専用変数にアクセスするときのリンカーエラー
あなたはこれを考えましたか?静的クラス内の非静的メンバーを許可する目的は何でしょうか? – mpen
私はルール '静的クラスは非静的メンバーを持つことはできません'を知っています。しかし、私は理由を理解したかった。実際に私は、静的なクラスとそのメンバーがどのように格納されるか、非静的なクラスとメンバがどのように格納されるかというように、メモリの面でもっと不気味な答えを期待していました。 :) – NLV