zoukankan      html  css  js  c++  java
  • 静态方法和动态方法的区别 dodo

    1.静态的方法在整个应用程序其间存储在内存中,速度快,但占用内存. 

        class A

        {

            public static string b()

            {

                return "Hello";

            }

        }  

    用法:  A.b();      //调用方便 

     

    2.动态的方法在先声明类实例才能调用类中的方法. 

        class A

        {

            public string b()

            {

                return "Hello";

            }

        }  

    用法:   A  a  =  new  a();      a.b();     

     

    3.一般使用频繁的方法用静态方法,用的少的方法用动态的。静态的速度快,占内存。动态的速度相对慢些,但调用完后,立即释放类,可以节省内存,可以根据自己的需要选择是用动态方法还是静态方法。

    4.静态方法主要的问题就是数据同步的问题。如果你的静态方法的类中不保存私有变量那么什么问题都不会有的。最好是包要操作的数据全部以参数的方式传到方法中去

    5. 静态方法是类方法,调用时不需要创建类实例。
    6. 静态方法是静态绑定到子类,不是被继承。

    为了形象说明,请看下面的例子。

    namespace Test.CUI
    {
      class Base
      {
        public Base()
        {
          Console.WriteLine("Base...");
        }

        public void Method()
        {
        }

        public static void StaticMethod()
        {
        }
      }

      class Class1 : Base
      {
        public Class1()
        {
          Console.WriteLine("Class1...");
        }

        static void Test1()
        {
          Class1 o = new Class1();
          o.Method();
        }

        static void Test2()
        {
          Class1.StaticMethod();
        }

        static void Main(string[] args)
        {
        }
      }
    }


    接下来,我们查看编译后的IL代码就会明白其中的奥妙。

    .method private hidebysig static void Test1() cil managed
    {
     // Code Size: 13 byte(s)
     .maxstack 1
     .locals (
     Test.CUI.Class1 class1)
     L_0000: newobj instance void Test.CUI.Class1::.ctor() // 创建对象实例
     L_0005: stloc.0
     L_0006: ldloc.0
     L_0007: callvirt instance void Test.CUI.Base::Method() // 使用callvirt
     L_000c: ret
    }

    .method private hidebysig static void Test2() cil managed
    {
     // Code Size: 7 byte(s)
     .maxstack 0
     L_0000: call void Test.CUI.Base::StaticMethod() // 使用call
     L_0005: nop
     L_0006: ret
    }


    CLR提供了2个IL指令来调用方法:call和callvirt。其中call指令根据引用变量的类型(即引用变量的静态类型、声明类型)来调用一个方法,而callvirt指令根据引用变量的对象类型(引用变量的动态类型、实际类型)来调用一个方法。 

    7.从面向对象的角度来看:
    静态方法面向的是类的操作,而实力方法面向的是对象.举个例子来说
    例如动物,是一类,一只猫啦,一条狗啦,都是它的子类的一个对象,这些对象不同的猫和狗可能有不同的消化系统,还有行走之类的,所以它们的"爬行"方式可以不同,但是这些动物的死法都是一样的,那就是心跳停止,对于动物类的设计可以考虑这么一个方案:
    public static void Kill ( Animal aAnimal)
    {
       //let the animal stop heart beating
    }
    对于每个对象的具体实现方式,由对象来完成.

    8.静态方法修改的是类的状态,而对象修改的是各个对象的状态,这点也是它们重要的区别

    9.类的实例化调用是在类的生命周期中存在,当类没有了以后,对应的实例也就没有了,对应的方法也就没有了,静态类不然,只要你引用了那个静态类的命名空间,他就会一直存在,知道你退出系统。

  • 相关阅读:
    排序算法
    各种容器
    avl树
    zhenya moves from parents
    maven 相关
    Spring Cloud 子项目介绍
    WebStorm 中 dva 项目用 start 命令需要不断重启项目问题
    git常用命令
    SQL 的各种 join 用法
    程序员成长过程
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1286915.html
Copyright © 2011-2022 走看看