代码之家  ›  专栏  ›  技术社区  ›  Jeremy H

什么是“静态”类?

  •  40
  • Jeremy H  · 技术社区  · 16 年前

    在c中:

    public static class ClassName {}
    

    还有:

    public class ClassName {}
    
    10 回复  |  直到 7 年前
        1
  •  37
  •   CodesInChaos    11 年前

    静态类不能实例化,只能包含静态成员。因此,对静态类的调用如下: MyStaticClass.MyMethod(...) MyStaticClass.MyConstant .

    非静态类可以实例化,并且可以包含非静态成员(实例构造函数、析构函数、索引器)。非静态类的非静态成员只能通过对象调用:

    MyNonStaticClass x = new MyNonStaticClass(...);
    x.MyNonStaticMethod(...);
    
        2
  •  66
  •   Jon Skeet    12 年前

    首先,对一个回答的评论被问及“静态”是什么意思。在c术语中,“static”表示“与类型本身相关,而不是与类型的实例相关。”您使用类型名而不是引用或值访问静态成员(从另一个类型)。例如:

    // Static method, so called using type name
    Guid someGuid = Guid.NewGuid();
    // Instance method, called on a value
    string asString = someGuid.ToString();
    

    现在,静态类…

    静态类通常用作“实用程序”类。典型的例子可能是 System.Math . 创建一个数学实例是没有意义的——它只是“是”。一些规则(包括“可以”和“不能”):

    • 静态类总是从 object . 不能指定其他基类型,也不能使静态类实现接口。
    • 静态类不能有任何实例成员-所有变量、方法等都必须是静态的。
    • 静态类不能声明任何实例构造函数和编译器 默认情况下创建无参数构造函数。(在C类2中出现静态类之前,人们通常会创建一个带有私有构造函数的抽象类,从而防止实例化。这里不需要。
    • 静态类是隐式抽象的(即,它们被编译为描述抽象类的IL),但不能添加 abstract 调整你自己。
    • 静态类是隐式密封的(即,它们被编译为描述密封类的IL),但不能添加 sealed 调整你自己。
    • 静态类 可以 通用。
    • 静态类 可以 嵌套在非静态类或静态类中。
    • 静态类 可以 具有嵌套类型(非静态或静态)。
    • 只有静态的顶级非泛型类才能包含扩展方法(C 3.0)。
        3
  •  6
  •   Dan Herbert    16 年前

    静态类也不能从继承,而具有静态成员的非静态类可以从继承。

        4
  •  6
  •   rghome    7 年前
    public static class ClassName {}
    

    静态类就像一个全局变量:您可以在代码中的任何地方使用它,而无需实例化它们。 例如: ClassName。在点运算符之后,可以使用它的任何属性或函数。

     public class ClassName {}
    

    但是如果您有非静态类,那么您需要创建这个类的实例。 例如:

     ClassName classNameObject = new ClassName(); 
    
        5
  •  5
  •   Mark Simpson    16 年前

    静态类中的所有方法/属性 必须 是静态的,而“普通”类可以包含实例和静态方法的混合。

        6
  •  3
  •   Henk Holterman    16 年前

    不能实例化(创建)静态类的对象。它只能包含静态成员。

    示例:System.Math

        7
  •  3
  •   Konstantin Tarkus    16 年前

    静态类只能包含静态成员。

    静态成员可以在不先实例化类的情况下使用。

        8
  •  2
  •   Christian C. Salvadó    16 年前

    静态类和成员用于创建无需创建实例即可访问的数据和方法(使用 new 关键字,它们不能有类的构造函数)。

    当不依赖于静态类本身的对象标识时,可以声明静态类,因此静态类只能包含静态成员。

    当加载包含类的程序或命名空间时,CLR将加载这些类。

    它们也是密封的,不能从中继承。

        9
  •  2
  •   Sanjeev Kumar Dangi    14 年前

    http://www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html -这篇文章写得很好。这是为Java编写的。但我认为C中的概念也应该相同。

        10
  •  1
  •   richu    11 年前

    C中的静态变量

    作为自动变量的类的局部变量 但静态变量不会消失,因为函数不再处于活动状态。它们的值将保持不变。如果控件返回,静态变量的值将相同

    C中的静态函数 对其他文件中的函数不可见的函数。

    * cpp中的静态数据成员* 数据成员可以是cpp中的变量或函数 静态应用于两个数据成员 类本身可以是静态的 “该类中的所有对象只共享一个静态数据成员副本” 静态数据成员只能访问静态数据成员

    静态类 此类无法实例化对象