zoukankan      html  css  js  c++  java
  • 静态类、静态方法、静态成员和实例成员的比较

    任何项目中都会使用到静态类、静态方法、静态成员和实例成员了。那么这几个名词到底有哪些区别呢?

    1、静态成员和实例成员

    静态成员:静态成员通常和类是相关联的。它可以作为类中公有的变量,不依赖特定对象的存在。通常我们在访问它们的时候很简单,直接通过类名加点操作符再加变量名来进行操作。

    实例成员:实例成员通过和对象是相关联的。一般情况下,我们都是对类的实例化来进行访问操作。如果实例不存在,那么也就无法访问实例成员对象。

    所以实例成员的存在必须要有对象实例的存在,如果对象实例都不存在了,那么就将无法访问;而静态成员只是依赖于类的存在与否,也就无需声明和实例化对象了。

    如下方这段示例:

        class Program
        {
            static void Main(string[] args)
            {
                MyStaticText.MyStaticMethod(); //静态方法调用
    
                MyStaticText myStaticText = new MyStaticText();
    
                myStaticText.MyExampleMethod(); //实例方法调用
    
                Console.ReadKey();
            }
        }
    
        class MyStaticText
        {
            private int exampleInt = 5;
            private static int staticInt = 6;
            public static void MyStaticMethod()
            {
                Console.WriteLine("开始调用静态方法:");
    
                MyStaticText myStaticText = new MyStaticText();
    
                myStaticText.MyExampleMethod();
    
                Console.WriteLine(staticInt);
    
                Console.WriteLine("结束调用静态方法:");
            }
    
            public void MyExampleMethod()
            {
                Console.WriteLine(exampleInt);
            }
        }
    
        static class MyStaticClassText
        {
            public static int GetStuNo()
            {
                return 1;
            }
    
            public static string GetStuName()
            {
                return "Jim";
            }
        }
    

    最后的输出结果为:

    2、静态类

    我们知道,对于类有很多修饰符,如public,同时,类也可以声明为static,表示它仅可以包含静态成员。不能实例化来创造类的实例。比方说,在有些特定业务中,不需要操作实例数据也不与代码中特定对象关联。那么此时,就需要使用静态类来包含特定的方法。

    静态类的主要功能如下:

    • 类中仅包含静态成员和静态方法。并且必须被static修饰。
    • 它们不能被实例化。
    • 它们是密封的。那么此时编译器编译时会自动生成sealed标记。

    项目中使用静态类的优点在于,对于静态类的创建,编译器能够执行检查以确保不会偶然的添加实例成员。同时,静态类时密封的,因此也不允许被继承。

    如下方代码示例:

        static class MyStaticClassText
        {
            public static int GetStuNo()
            {
                return 1;
            }
    
            public static string GetStuName()
            {
                return "Jim";
            }
        }
    

    3、类的静态成员和非静态成员

    对于一个类中的静态成员和非静态成员到底有哪些区别呢?

    1. 语法区别:静态成员需要static关键字修饰,而非静态成员可以不需要。
    2. 存储区别:对于静态成员而言,它是存储在程序中全局变量存储区中,并且在整个程序运行期间只在内存中有一个位置,既不会拷贝也不会复制。
    3. 归属区别:静态成员属于类的成员变量,无论对一个类实例化多少次,这个类的静态成员都只有一个副本,程序中各个地方对它的调用都会改变它的值;而非静态成员属于他的对象,各自对象对自身实例的改变不会各自影响。
    4. 初始化顺序的区别:初始化时首先初始化类的静态成员,然后才是非静态成员。

    根据上述内容,下面示例代码的输出是多少呢?

        class Program
        {
            private static int i = GetNum();
            private static int num = 10;
    
            int j = GetNum();
    
            private static int GetNum()
            {
                return num;
            }
            static void Main(string[] args)
            {
                Console.WriteLine("i={0}", i);
    
                Program program = new Program();
    
                Console.WriteLine("j={0}", program.j);
    
                Console.WriteLine("i={0}", i);
    
                Console.ReadKey();
            }
        }
    

    输出结果为:

    以上就是对静态方法、静态成员、静态类和实例成员的比较。有不对的地方请大家指正或者一起交流。

  • 相关阅读:
    linux打包解压包(.tar .gz .tar.gz .zip)
    centos安装fusesshfs通过挂载目录实现数据双向同步
    WSL远程访问Windows下的MySQL方法
    Linux中hugepage的使用方法
    Python科普系列——类与方法(下篇)
    Treevalue(0x02)——函数树化详细解析(上篇)
    Treevalue(0x03)——函数树化详细解析(下篇)
    Python科普系列——类与方法(上篇)
    个人网站迁移之旅:从博客到知识库,从 Hexo 到 Docusaurus
    wpf 动画结束后保留end值,动画结束后会失去绑定,可以在completed事件重新进行绑定
  • 原文地址:https://www.cnblogs.com/aixiaojun/p/8373481.html
Copyright © 2011-2022 走看看