派生类的构造函数(层次结构)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ecnuThomas/article/details/55000295

   在创建派生类的实例时,实际上会有多个构造函数起作用。要实例化的类的构造函数本身不能初始化,还必须调用基类的构造函数。这是为什么使用层次结构进行构造的原因。

class Animal{
	private string name;
}
class Dog{
	private int wight;
}

Animal animal =new Dog();

成员字段name和wight都在实例化animal对象时进行初始化。如果没有提供自己的构造函数,而是仅依赖默认的构造函数,name就会初始化为null引用,wight初始化为0.

假定默认的构造函数在整个层次结构中使用:编译器首先找到它制图实例化的类的构造函数,在本例中是Dog,这个默认Dog构造函数首先要做的是为其直接基类Animal运行默认构造函数,然后Animal构造函数为其直接基类System.Object运行默认构造函数,System.Object没有任何基类,所以他的构造函数就执行,并把控制返回给Animal构造函数。现在执行Animal构造函数,把name初始化为null,再把控制权返回给Dog构造函数,接着执行这个构造函数,把wight初始化为0,并退出。此时,Dog实例就已经成功地构造和初始化了。

构造函数的调用顺序是先调用System.Object,再按照层次结构由上向下进行,直到到达编译器要实例化的类为止。还要注意在这个过程中,每个构造函数都初始化它自己的类中的字段。

注意构造函数的执行顺序。基类的构造函数总是最先调用,也就是说,派生类的构造函数可以在执行过程中调用基类方法、属性和其他成员,因为基类已经构造出来的,其字段也初始化了。

为了说明这一原理,举个例子:

class University{ 
 	 private University();
 }
 class Institute:University{
 	public Institute();
 }
 Institute institute = new Institute();

这样会报错的。错误类型是:University.University()无法访问,因为它受访问级别限制。

更不用说用University university = new University();和  University iuniversity =new Institute();来创建实例对象了。

     但是,如果改成这样

class University{ 
 	public University();
 }
class Institute:University{
	private Institute();
}
University university = new University();

        这样就不会有问题了。


猜你喜欢

转载自blog.csdn.net/ecnuThomas/article/details/55000295