派生类的构造函数
我们都知道 单个类的构造函数是干嘛用的。但是如果一个类直接或者间接的派生自很多个别的类的时候,是不是只执行当前实例化的那个类的构造函数呢?
答案是:NO!
现在假定这么一个情况,我们没有为自己所定义的类 添加带参数的构造函数,所以编译器会帮我们默认添加一个不带参数的构造函数,当你在实例化你当前类时,其实后台做了很多事情,而不只是单单的执行你当前类的构造函数初始化当前类的成员字段。从结果上也可以看出来这个观点:那就是当你每次实例化一个对象时,你发现 你的对象都可以使用object提供的一些方法,你可以说 这是因为继承啊。但是这并没有解释出,为什么我就能调用这些方法,因为我在前面就说过了; C#方法要么和类关联,要么和实例关联,Object中的方法,它不属于你当前类,它属于object,但是你却可以使用它。原因是,C#中 每次实例化生成的实例 其实都是继承链 最顶端的那个对象实例,只不过是加上了一些额外信息而已。(派生类对基类的扩展)。除了方法 之外,你也发现 你可以调用 基类中的某些字段,细心点 你还会发现这些字段都是默认值。比如int 为0 bool 为false 等。
理解了上述这段话以后,我来彻底的分析一下,当你实例化一个不带有参数签名的构造函数的时候,后台到底都干了一些什么事情。
用例子来说:
//定义基类
public class Father
{
//私有的 子类无法访问到
private int age;
}
//定义派生类
public class Son:Father
{
public string name;
}
当我们执行:
Father f = new Son();
会发现f.age=0;
上述的 age 在基类中是一个private修饰符,
此字段只能在当前类的内部在能使用,
也就是说,派生类中是无法访问和控制到这个属性的,但是我 门发现它的值被赋给了0.这好像和我们前面说过了 无参构造函数的结果一样。给int 赋0.
这是怎么一回事呢?
当我们在实例化某一个类的实例的时候,编译器会首先找到它试图实例化类的构造函数,找到之后,它就会通过该构造函数的签名往上找,找到当前类的基类中具有相同参数签名的构造函数。。。。这个过程会依次向上执行,只到找到object中响应的构造函数为止。然后编译器,会首先执行object类中的构造函数,然后向下,依次执行各个类中的构造函数 用来初始每个类中各自的字段成员。直到编译器找到了 你当前实例化的那个对象为止。
所以最终结果为:构造函数的调用顺序应为最先调用System.Object的构造函数,然后依次向下 直到编译器找到当前实例化的那个对象为止。
构造函数的调用顺序 总是先调用基类的构造函数,也就说明了,派生类为什么可以在执行过程中调用基类的方法 和属性了。
最后总结:
当你实例化一个对象时,编译器会通过你当前实例化的这个对象的构造函数往上找,(如果构造函数没有参数),这个寻找的过程会一直延续到System.Object.
然后,编译器 会首先调用 Object的构造函数,然后依次向下的调用派生类的构造函数,直到你正在实例化的那个对象为止。
---------------------- Windows Phone 7手机开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://net.itheima.com/