黑马程序员_学习日记5_C#基础归纳总结之派生类的构造函数
来源:互联网 发布:蛇精脸拍照软件 编辑:程序博客网 时间:2024/06/05 14:52
派生类的构造函数
我们都知道 单个类的构造函数是干嘛用的。但是如果一个类直接或者间接的派生自很多个别的类的时候,是不是只执行当前实例化的那个类的构造函数呢?
答案是: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/
- 黑马程序员_学习日记5_C#基础归纳总结之派生类的构造函数
- 黑马程序员_学习日记3_C#基础归纳总结之结构
- 黑马程序员_学习日记4_C#基础归纳总结之继承
- 黑马程序员_学习日记6_C#基础归纳总结之堆栈分配图解
- 黑马程序员_学习日记7_C#基础归纳总结之泛型
- 黑马程序员_学习日记9_C#基础归纳之foreach迭代
- 黑马程序员_学习笔记8_C#基础归纳之数组
- 黑马程序员_学习日记1_C#基础
- 黑马程序员_学习日记1_有关C#基础知识总结归纳之对象和类型
- 黑马程序员_学习日记2_有关C#基础知识总结归纳之对象和类型
- 黑马程序员_学习日记十四_基础加强之JDK1.5的新特性
- 黑马程序员_C#基础篇总结5
- 黑马程序员_学习日记十六_基础加强之泛型、类加载器
- 黑马程序员_C语言01_基础总结
- 黑马程序员_C语言01_基础总结
- 黑马程序员_C语言01_基础总结
- 黑马程序员_.NET构造函数总结
- 黑马程序员_C语言基础_指针
- oralce中的with as语句
- COMMON LISP语言学习笔记(一)
- 你确定你真的懂了line-height吗?
- WebView.PictureListener 加载事件及完成更新
- android Toast大全(五种情形)建立属于你自己的Toast
- 黑马程序员_学习日记5_C#基础归纳总结之派生类的构造函数
- iphone run crycle
- Errors occurred while updating the change sets for SVNStatusSubscriber的解决
- csdn的第一篇日志
- 动态加载JS的四种方法
- Dijkstra
- 在PHP中如何使用Predis
- HDU1088 字符串
- CUDA编程时使用device全局变量遇到的错误