欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

类不需要实例化也能直接用

程序员文章站 2022-05-23 16:02:17
...


  在我以前的意识中,我们需要用到某个类的时候,需要先实例化这个类,实例化出一个对象,然后在使用这个类里面的方法和属性,今天偶然的机会了解到,原来有些类是不需要实例化就可以直接用的——静态(static)类,同时我们可以直接使用静态类中的方法和属性。
  类、字段、属性、方法等只要是被static修饰后,变为静态类、静态字段、静态属性、静态方法,此时,在其他的类中可以直接调用这些字段,属性,方法等。

基本知识:
static修饰的类成为静态类,静态类中只能包含静态成员(被static修饰的字段、属性、方法),不能被实例化,不能被继承;非静态中可以包含静态成员。

演示:

下面我通过实例来掩饰一下:
首先需要建立一个C#控制台项目。(新建过程省略)

1、需要被实例化的类

如果被调用成员为非静态成员,那么它所属的类一定是非静态类。

namespace _1_被调用时必须先实例化的情况
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassA a = new ClassA();
            a.test();//如果不先实例化classA,无法调用test方法。
        }
    }
}

被调用的非静态类。

using System;

namespace _1_被调用时必须先实例化的情况
{
    public class ClassA
    {
        public void test()
        {
            Console.WriteLine("我是非静态类ClassA中的方法test。");
           
            Console.ReadKey();
        }
    }
}

解释:ClassA类为非静态类,其中的方法test()也为非静态方法,所以在main函数中调用时需要先实例化ClassA类。

2、不需要实例化的情况

1)被调用的成员为非静态类

namespace _2_被调用时不需要实例化的情况_被调用类为非静态类
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassB.test();
        }
    }
}

调用非静态类中的静态方法

using System;

namespace _2_被调用时不需要实例化的情况_被调用类为非静态类
{
    public class ClassB
    {
        public static void test()
        {
            Console.WriteLine("我是非静态类ClassB中的方法test。");

            Console.ReadKey();
        }
    }
}

ClassB类为非静态类,但其中的方法test()为非静态方法,所以在mian函数中调用时不实例化ClassB类(而且不能实例化),直接调用其成员,语法为“类名.成员”。

2)被调用类为静态类

namespace _3_被调用时不需要实例化的情况_被调用类为静态类
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassC.test();
           
        }
    }
}

调用静态类中的静态方法

using System;

namespace _3_被调用时不需要实例化的情况_被调用类为静态类
{
    public static class ClassC
    {
        public static void test()
        {
            Console.WriteLine("我是非静态类ClassC中的方法test。");

            Console.ReadKey();
        }
       
    }
}

ClassC类为静态类,其中的方法也test()为非静态方法,所以在main函数中调用时不实例化classC类(而且不能实例化),直接调用其成员,语法为“类名.成员”。

原因

static修饰的对象具有以下特点:
1.全局唯一,任何一次的修改都是全局性的影响
2.只加载一次,优先于非静态
3.使用方式上不依赖于实例对象。

static 关键字的作用就是把类的成员变成类的相关,而不是实例相关,也就是说static修饰的成员是属于整个类的,而不是属于某个具体的对象。既然是全局唯一,那么就没有必要在去实例化后再用了。