首页 > 其他分享 >3_静态类与非静态类的区别

3_静态类与非静态类的区别

时间:2024-03-03 23:15:47浏览次数:22  
标签:区别 静态 StaticClass 实例 static 与非 public 构造函数

静态类与非静态类的区别?

  1. 静态类无法实例化(换句话说,无法使用new运算符创建类类型的变量。 由于不存在任何实例变量,因此可以使用类名本身访问静态类的成员)。
  2. 静态构造函数只调用一次,在程序所驻留的应用程序域的生存期内,静态类会保留在内存中(即使用Static修饰的类,应用一旦启用静态类就会保留在内存中)。
  3. 静态类只包含静态成员
  4. 不能包含实例构造函数。
  5. 静态类会进行密封,因此不能继承。 它们不能继承自任何类(除了 Object)。 静态类不能包含实例构造函数。 但是,它们可以包含静态构造函数。

1. 实例化

  • 非静态类可以实例化,也就是说,可以使用 new 关键字创建类的对象。
  • 静态类不能实例化,无法使用 new 关键字创建类的对象。

示例:

// 非静态类
public class NonStaticClass
{
    public int InstanceVariable;
    public NonStaticClass()
    {
        InstanceVariable = 10;
    }
    public void Print()
    {
        Console.WriteLine(InstanceVariable);
    }
}

// 静态类
public static class StaticClass
{
    public static int StaticVariable;
    static StaticClass()
    {
        StaticVariable = 20;
    }
    public static void Print()
    {
        Console.WriteLine(StaticVariable);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        // 非静态类可以实例化
        NonStaticClass nonStaticClass = new NonStaticClass();
        nonStaticClass.Print(); // 输出:10
        // 静态类不能实例化
        //StaticClass staticClass = new StaticClass(); // 错误:无法创建“StaticClass”类型的对象
        // 访问静态类的成员需要使用类名
        StaticClass.Print(); // 输出:20
    }
}

2. 构造函数

  • 非静态类可以包含实例构造函数,用于在创建对象时初始化对象的成员。
  • 静态类不能包含实例构造函数,但可以包含静态构造函数,用于在类第一次加载到内存时执行一次性初始化。

示例:

// 非静态类可以包含实例构造函数
public class NonStaticClass
{
    public int InstanceVariable;
    public NonStaticClass()
    {
        InstanceVariable = 10;
    }
    public void Print()
    {
        Console.WriteLine(InstanceVariable);
    }
}

// 静态类可以包含静态构造函数
public static class StaticClass
{
    public static int StaticVariable;
    static StaticClass()
    {
        StaticVariable = 20;
    }
    public static void Print()
    {
        Console.WriteLine(StaticVariable);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        // 非静态类的实例构造函数在创建对象时执行
        NonStaticClass nonStaticClass = new NonStaticClass();

        // 静态类的静态构造函数在类第一次加载到内存时执行
        StaticClass.Print(); // 输出:20
    }
}

3. 成员类型

  • 非静态类可以包含实例成员和静态成员。
  • 静态类只能包含静态成员。

示例:

// 非静态类可以包含实例成员和静态成员
public class NonStaticClass
{
    public int InstanceVariable; // 实例成员
    public static int StaticVariable; // 静态成员
    public NonStaticClass()
    {
        InstanceVariable = 10;
    }
    public void Print()
    {
        Console.WriteLine(InstanceVariable);
        Console.WriteLine(StaticVariable);
    }
}

// 静态类只能包含静态成员
public static class StaticClass
{
    public static int StaticVariable;
    static StaticClass()
    {
        StaticVariable = 20;
    }
    public static void Print()
    {
        Console.WriteLine(StaticVariable);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        NonStaticClass nonStaticClass = new NonStaticClass();
        nonStaticClass.Print(); // 输出:10 20
        // 访问静态类的成员需要使用类名
        StaticClass.Print(); // 输出:20
    }
}

4. 继承

  • 非静态类可以继承自其他类。
  • 静态类不能继承自其他类,也不能被其他类继承。

示例:

// 非静态类可以继承自其他类
public class Animal
{
    public string Name { get; set; }
}
public class Dog : Animal
{
    public string Bark()
    {
        return "汪汪";
    }
}
// 静态类不能继承自其他类
//public static class StaticClass : Animal // 错误:静态类不能继承

标签:区别,静态,StaticClass,实例,static,与非,public,构造函数
From: https://www.cnblogs.com/cookie2030/p/18050955

相关文章

  • 1_readonly与const区别
    readonly与const区别?readonly关键字(运行时常量):字段可以在声明或构造函数中初始化,常作为运行时常量使用。const关键字(编译时常量):字段只能在该字段的声明时初始化,常作为编译时常量使用过。C#中的readonly和const都是用于声明常量的关键字,但它们之间存在一些关键的区......
  • 11_C# 中字符串 string.Empty,"",null 三者的区别
    C#中字符串string.Empty、""和null三者的区别1.string.Emptystring.Empty是一个表示空字符串的静态字段。它实际上等同于""(空字符串),但使用string.Empty可以更加清晰地表示我们需要一个空字符串。2.""(空字符串)双引号中没有任何字符的字符串被称为空字符串。它......
  • 10_C# 中的 String 和 StringBuilder 的区别
    C#中的String和StringBuilder的区别1.String类String类表示不可变的字符串。一旦创建String对象,其内容就不能再被修改。对String对象进行任何修改操作都会返回一个新的String对象。示例:stringstr1="Hello";stringstr2=str1+"World!";Console.W......
  • 9_dynamic动态类型与object类型的区别
    C#中dynamic动态类型与object类型的区别1.object类型object类型是.NET中System.Object类的别名。在C#中,所有类型(预定义、用户定义、引用类型、值类型)都直接或间接继承自Object。因此,我们可以将任何类型的值用object对象来接收。2.dynamic动态类型动态......
  • 6_as和is的区别
    as和is的区别is只是做类型兼容判断,并不执行真正的类型转换。返回true或false,不会返回null,对象为null也会返回false。as运算符将表达式结果显式转换为给定的引用类型或可以为null值的类型。如果无法进行转换,则as运算符返回null。总结:as模式的效率要比is模式的高,因为借......
  • 基因序列中的一些名词区别
      1.基因分为编码区和非编码区,编码区包含外显子和内含子,一般非编码区具有基因表达的调控功能,如启动子在非编码区。编码区则转录为mRNA并最终由外显子部分翻译成多肽(蛋白质)。2. 内含子(intron)是真核生物细胞DNA中的间插序列。这些序列被转录在前体RNA中,经过剪接被去除,最终不存......
  • 定义与声明的区别
    在C++中,声明和定义有以下区别:声明(Declaration):声明是向编译器介绍变量、函数、类等的名称和类型。声明不分配存储空间,也不初始化变量。声明通常出现在函数原型、类定义或全局变量声明中。例如,声明一个整型变量inta;,这里只告诉编译器有一个名为a的整型变量,但并没有为它分配存储......
  • redis和memcached的区别
    观点一:1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value交换到磁......
  • RabbitMQ、RocketMQ、Kafka区别
    引言1、队列应用场景:MQ(MessageQueue,消息队列)消息队列在实际应用中常用的使用场景(优点):异步处理,应用解耦,流量削锋和消息通讯四个场景。2、目前使用较多的消息队列:有老牌的ActiveMQ、RabbitMQ,ZeroMQ,炙手可热的Kafka,MetaMQ,阿里巴巴的RocketMQ。3、如何选型(目前现状):......
  • ulimit.conf中soft和hard区别及常用配置
    在Linux中,ulimit命令用于限制用户对shell资源的访问,包括进程数、文件打开数等。这些限制可以分为软限制(softlimit)和硬限制(hardlimit)。软限制(softlimit)是当前系统生效的设置值,可以理解为一种警告的设定。当资源使用超过这个限制时,系统并不会立即阻止,而是会发出警告信息,提示用户......