关于静态方法

对于初学OOP的人,静态方法是个不大不小的问题。在此,做个粗浅说明。

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

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

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指令根据引用变量的对象类型(引用变量的动态类型、实际类型)来调用一个方法。 

时间: 2024-09-17 13:15:00

关于静态方法的相关文章

扩展jQuery静态方法:extend(dest,src1,src2,src3...srcN)

文章简介:Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解. Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解. 1. extend(src), 扩展jQuery静态方法. 也就是说,将src对象的属性和方法逐一复制给jQuery Java代码 $.extend({ test:function(){alert('test函数')} }) 2. extend(dest

PHP中静态方法(static)与非静态方法的使用及区别

static关键字用来修饰属性.方法,称这些属性.方法为静态属性.静态方法. static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为"类属性"或"类方法" 如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号"::"调用. static关键字可以用来修饰变量.方法. 不经过实例化,就可以直接访问类中static的属性和static的方法. static 的属性和方法,只能访问sta

通过反射填充泛型集合List的静态方法

集合|静态 呃```花了一晚上时间,终于搞出来了如何通过反射,从DataReader将数据填充到数据实体泛型集合的静态方法. //Kchen.Core.BaseBusinessObject为通用数据实体类,此处仅为限定T所继承的类型        public static IList<T> FillDataListGeneric<T>(System.Data.IDataReader reader) where T : Kchen.Core.BaseBusinessObject  

php的静态变量和静态方法

静态变量也称为类变量,静态方法也称为类方法. 简单的说,静态变量就是所有对象都共享的变量.静态变量也称为类变量,静态方法也称为类方法. 如何定义静态变量 访问修饰符 static 变量名; 如何访问静态变量: (1)在类外部:类名::$类变量名 (2)在类内部:self::$类变量名或者::$类变量名 例:一群小孩在玩游戏,不时有新的小孩加入游戏.问:如何知道现在有多少小孩在玩游戏,用面向对象的思想来实现. 静态变量与变通变量的区别: (1)加上static称为静态变量或者类变量,否则称为实例变

java静态方法和实例方法的区别

静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名. 方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就 是说,调用静态方法可以无需创建对象. 静态方法在访问本类的成员时,只允许访问静态成员(即静 态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制. 下面几个 例子展示了这一区别. 1.调用静态方法示例. //-----------hasStaticMethod.java-

文件的静态方法(Static File Methods)

用户也许会认为使用File对象的方法就是建立一个具有特定名称的文件而已.然而实际上File对象也包含了一些静态方法(static methods).通过这些方法,用户可以不需要使用File类的对象的名称而直接使用File类的名称来进行一些操作.在vb7.0的语法中,这些被称为共享的方法(share methods),但是起的作用是一样的. 在下表中,列出了一些具有代表性意义的文件的静态方法的用法,现在假定已经有名为fl的文件对象,那么就可以通过下面这个表来参考一上不用fl的方法就能对fl进行一些

Groovy探索之MOP 六 运行期内添加构造器和静态方法

构造器是我们喜欢重载的一个方法,因为我们在实例化一个类的时候,会遇到各种各样的情况,比如在某些情况下,一系列类的实例可能有一些相同值的属性,这时候,我们在实例化对象时,就不希望把这些相同的值分别注入到每一对象中,这样的工作很繁琐. 这时候,我们就会重载构造器,但一些时候,比如一些Bean对象,它们的属性很多,我们就不好在类中重载很多构造器.比如,我们有如下的一个GroovyBean类: class Reader { String province String city String name

C#静态方法概念解析实例

C#静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例.非静态方法可以访 问类中的任何成员,而静态只能访问类中的静态成员.那么对于C#静态方法的这种特性我们 是如何把握的呢?让我们来看看一个简单的C#静态方法应用实例: C#静态方法实例演示: class A { int x; static int y; static int F(){ x=1; //错误,不允许访问 y=2; //正确,允许访问 } C#静态方法应用实例分析: 1.在这个类定义中,C#静态方法F()可以访问类中静态成员y

C#静态方法与非静态方法的比较

C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢? 他们在使用上会有什么不同呢?让我们来看看最直观的差别:使用了static 修饰符的方法为 静态方法,反之则是非静态方法. 下面我们分四个方面来看看C#静态方法与非静态方法的差异: C#静态方法与非静态方法比较一.C#静态成员: ①静态成员属于类所有,非静态成员属于类的实例所有. ②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储: 非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例, 类的

C#静态方法使用经验浅谈

C#静态方法有什么弊端? 我们在实际的开发过程中会注意到C#静态方法对于我们程序的影 响,那么有哪些C#静态方法使用的体会呢?这里我们来看看一些方面: C#静态方法使用中遇到的问题: 在源码工程中几乎没有看到什么静态方法,但是在Ms的SQLHelper中几乎全部使用的是静 态方法,为什么会这样呢?我们来看看有以下的几种可能: 1.在一些系统中使用非常频繁的方法都使用静态方法可以提高系统性能我是这么认为的 :) 2.本身不可升级, 重写 这要看一个软件产品的目的是什么了. 3.为了方便,不用实例化