黑马程序员_学习日记5_C#基础归纳总结之派生类的构造函数

来源:互联网 发布:蛇精脸拍照软件 编辑:程序博客网 时间:2024/06/05 14:52
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------

派生类的构造函数

      我们都知道 单个类的构造函数是干嘛用的。但是如果一个类直接或者间接的派生自很多个别的类的时候,是不是只执行当前实例化的那个类的构造函数呢?

答案是: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/
原创粉丝点击