.net构造函数

作用:初始化类的成员字段

如果没有显示声明一个构造函数,系统会默认分配一个无参的构造函数。

显示声明:

1 class Father
2 {
3 public Father()//1.签名和类名一致 2.没有返回值
4 {
5
6 }
7 }

最基本的构造函数只能初始化为标准的默认值

例如:引用类型为空引用,数字类型为0,bool为false

构造函数的重载:

class Father
{
private string name;
private int age;
//构造函数的重载
public Father(){}
public Father(string name) { this.name = name; }
public Father(string name, int age) { this.name = name; this.age = age; }
}

this关键字用来区分成员字段和同名参数
私有的构造函数:

1 //私有的构造函数
2 private Father(){}

私有的构造函数可以防止不相干的类来访问,并且不能用New关键字来实例化也不能被继承。

应用场景:1.类仅用作某些静态成员或属性的容器,因此永远不会被实例化

              2.希望类仅通过调用某个静态函数来实例化(类代理)

静态构造函数:

1 static Father()
2 {
3
4 }

静态构造函数只执行一次,实例构造函数只要创建实例就会执行。

场景:类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性

注意:1.静态构造函数不能用修饰符,因为该构造函数其他类从来不调用,而由.net运行库来调用所以public,private就没有意义,强制添加也会报错。

        2.静态构造函数不能有任何参数

        3.一个类只能有一个静态构造函数

        4.只能访问类的静态成员,不能访问实例成员。

 private string name;
private static int age;
static Father()
{
//name 将无法访问到
age = 10;//age是可以的因为他是静态的
}

        5.无参的实例构造函数可以和静态无参构造函数共存

1  class Father
2 {
3 public Father()
4 {
5 }
6 static Father()
7 {
8 }
9 }

从其他构造函数中调用构造函数:

多个版本的构造函数会出现重复的初始化

 1  class Father
2 {
3 private string name;
4 private int age;
5
6 public Father(string name)
7 {
8 this.name = name;
9 }
10 public Father(string name, int age)
11 {
12 this.name = name;//和上面的重复
13 this.age = age;
14 }
15 }

我们可以使用初始化器来解决

1 public Father(string name)
2 {
3 this.name = name;
4 }
5 public Father(string name, int age): this(name)
6 {
7 this.age = age;
8 }

this关键字仅用于调用最匹配的那个构造函数

注意:构造函数初始化器会在构造函数之前执行

派生类的构造函数:

在继承结构中父类必须提供一个无参的构造函数

//父类
class Father
{
private string name;
public Father(){}
public Father(string name)
{
this.name = name;
}
}

//子类
class Son : Father
{
private string name;
public Son(){}
public Son(string name)
{
this.name = name;
}
}

//三级子类
class SmalSon : Son
{
private string name;
public SmalSon(string name)
{
this.name = name;
}
}

继承下的构造函数调用顺序总是自上而下的

1  static void Main(string[] args)
2 {
3 Father fa = new Father();
4 Son son = new Son();
5 Father father = new SmalSon("xiao");
6 }

实例化Father 将只调用Father的构造函数

实例化Son将先调用Father的构造函数然后在调用自自身的构造函数

实例化SmalSon就会先调用Father-》Son-》SmalSon

所以,派生类可以执行它基类的方法或属性,因为其父类已经被构造出来了。

在层次结构中添加带参数的构造函数:

 //父类中没有提供默认的无参构造函数
private string name;
public Father(string name)
{
this.name = name;
}
1 //子类
2 class Son : Father
3 {
4 private string name;
5 public Son(string name):base(name)//子类通过base关键字制定实例化父类的那个构造函数,name为传递给父类构造函数的参数
6 {
7 this.name = name;
8 }
9 }

base只是指定在实例化子类时候实例化父类的某个构造函数,其他什么操作都不做。





 




 




 

posted @ 2012-03-14 12:13  猪特曼  阅读(701)  评论(0编辑  收藏  举报