C#继承中的静态构造函数和base关键字使用
2011-09-07 11:10 DylanChan 阅读(884) 评论(0) 收藏 举报静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
在使用静态构造函数的时候应该注意几点:
◇ 静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
◇ 是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
◇ 一个类只能有一个静态构造函数。
◇ 无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
◇ 最多只运行一次。
◇ 静态构造函数不可以被继承。
◇ 如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
◇ 是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
◇ 一个类只能有一个静态构造函数。
◇ 无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
◇ 最多只运行一次。
◇ 静态构造函数不可以被继承。
◇ 如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
◇ 静态构造函数的执行顺序 派生类 --> 基类
base关键字
◇ 其用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中。
◇ 调用基类上已被其他方法重写的方法。
◇ 指定创建派生类实例时应调用的基类构造函数。
//************ 定义基类Animal ************//
public class Animal
{
static string baseClassName;
protected string _skincolor;
//************ 基类Animal中的静态构造函数 ************//
static Animal()
{
baseClassName = "动物";
Console.WriteLine(baseClassName);
Console.WriteLine();
}
public Animal()
{
Console.WriteLine("一只动物出生了!!!");
Console.WriteLine();
}
protected Animal(string skincolor)
{
this._skincolor = skincolor;
Console.WriteLine("这只动物的颜色为:" + this._skincolor);
Console.WriteLine();
}
}
//************ 定义子类Horse继承父类Animal ************//
public class Horse : Animal
{
//************ 派生类Horse中的静态函数 ************//
static Horse()
{
Console.WriteLine("静态:一头小马驹出生了。。。。");
Console.WriteLine();
}
public Horse()
{
_skincolor = "赤兔马的红";
Console.WriteLine("一头小马驹出生了。。。。");
Console.WriteLine("这头小马驹的颜色为:" + this._skincolor);
Console.WriteLine();
}
double _weight;
string _sex;
public Horse(string skincolor, string sex, double weight)
: base(skincolor)
{
_skincolor = skincolor;
_weight = weight;
_sex = sex;
//base._skincolor=skincolor;
Console.WriteLine("一头小马驹出生了。。。。");
Console.WriteLine("这头小马驹为:" + this._sex);
Console.WriteLine("这头小马驹的颜色为:" + this._skincolor);
Console.WriteLine("这头小马驹的体重为:" + this._weight);
Console.WriteLine();
}
}
//************ 定义测试类Demo ************//
public class Demo
{
public static void Main(string[] args)
{
//Animal A = new Animal();
//Horse h = new Horse();
Horse hh = new Horse("纯白色", "雄性", 320);
//Horse hhh = new Horse("纯色", "雌性", 120);
}
}
静态构造函数的执行顺序
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B()
{
}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
//输出结果:X=1,Y=2
/*
* Main()函数在Class B中,执行点指向 public static int Y = A.X + 1;这句初始化Y的值为0
* 因为此句含有A.X,执行点跳到
* static A()
{
X = B.Y + 1;
}
* 并初始化X的值为0;接着向下执行X = B.Y + 1;后,X的值为1
* 然后再次执行public static int Y = A.X + 1;Y的值为2
*/
}
}
浙公网安备 33010602011771号