关于静态方法
来源:互联网 发布:佳明数据同步微信运动 编辑:程序博客网 时间:2024/05/17 20:28
对于初学OOP的人,静态方法是个不大不小的问题。在此,做个粗浅说明。
1. 静态方法是类方法,调用时不需要创建类实例。
2. 静态方法是静态绑定到子类,不是被继承。
为了形象说明,请看下面的例子。
接下来,我们查看编译后的IL代码就会明白其中的奥妙。
CLR提供了2个IL指令来调用方法:call和callvirt。其中call指令根据引用变量的类型(即引用变量的静态类型、声明类型)来调用一个方法,而callvirt指令根据引用变量的对象类型(引用变量的动态类型、实际类型)来调用一个方法。
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)
{
}
}
}
{
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
}
{
// 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指令根据引用变量的对象类型(引用变量的动态类型、实际类型)来调用一个方法。
- 关于静态方法
- 关于静态方法
- 关于静态方法
- 关于静态方法
- 关于静态方法
- 关于静态成员或静态方法
- 关于静态类和静态方法
- 关于ognl调用静态方法
- 关于静态方法的覆盖
- 关于静态方法,self,cls
- 关于静态变量、静态常量与静态方法
- 关于静态方法和非静态方法的心得
- 关于静态方法与非静态方法的执行效率
- 关于静态块,静态方法,非静态方法,构造方法执行的顺序
- 关于静态方法的小问题
- 关于类静态方法的小tip
- 关于静态方法的使用心得
- 关于JavaScript的gzip静态压缩方法
- Spring.xml
- 从C++转到Java需注意的地方
- 在10g以前来判断是否是根节点和叶子
- c# static的全部用法收集整理
- C#创建多线程应用程序
- 关于静态方法
- Delphi7 窗口停靠效果
- Dxperience 8.1.2 source 源代码和编译脚本
- sqlhelper使用指南
- SqlCommand的应用情形
- MySQL脚本运行及注意事项
- The Dude 系统需求
- 文档的书写规范
- Windows XP/2003解决网络连接问题步骤