您的位置:首页 > 职场人生

【黑马程序员】深入理解VS环境下的类继承和强制类型转换(自己的理解,如有偏差,请轻喷....)

2014-01-01 14:41 288 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

 a,类之间可以进行继承,Object类是所有类的父类(类都直接或间接继承之Object)



  建立三个类,Animal,Dog和Human;父类是Animal,Dog和Human继承自Animal,而Animal显然继承于Object:





于是,在使用的时候:



我们可以看到,Animal类里定义的属性和方法都可以看到了。同样的,我们查看Dog和Human。





我们可以看到两者同有的属性和方法(蓝色边框),因为两者都继承自Animal,也能看到两者分别独有的属性和方法(红色边框),但红色边框里的内容不同,因为Dog类和Human类之间没继承关系,所以两者私有的属性和方法不会通用。
【Q:看到了一些没有写的方法(Equals方法,GetHashCode方法,GetType方法,ToString方法),这些方法哪里来的?A:很显然,继承自Object中,因此显然是Object里定义的。】

b,父类变量可以指向子类对象,子类变量不能指向父类对象





如图例子,我们声明一个Dog类型的变量dog,再new一个对象放入dog。再声明一个Animal类型的变量ani,将dog放进ani中。同理Human。但如果我们声明一个Animal类型的变量animal,再new一个对象放入animal,这时却无法声明一个Dog类型或Human类型的变量,将animal放进去。为何?

以Dog dog=new
Dog()为例,我们可以把计算机的内存当作一个大宾馆,宾馆可以满足不同来宾的入住要求。Dog dog就可以看成宾馆设立了一种适合Dog入住的房间,而dog=new
Dog()可以看成是真的来了一个Dog类型的来宾dog 。而dog属于一种Animal,因此,假设专门开设给Dog类型来宾的房间不够或无法提供的时候,Animal类型的房间也同样可以入住。

但相反。如果Animal animal=new
Animal()来了一个Animal类型的来宾animal,这时即便不能提供Animal类型的房间,也不能提供Dog类型或者Human类型的,因为你无法确定animal到底是什么类型。(是个人啊,还是条狗啊)

c,强制类型转换



我们可以看到第二行报错,我们试图理解一下:

我们有一个Animal类型的房间,这时来了一个Dog类型的来宾animal,由于某种原因,没有入住到Dog类型的房间,而是进入了Animal类型的房间。这时候进到下一行,我们又有了一个Dog类型的房间,还能让animal换进入么?答案是否定的,因为animal已经进入了Animal类型的房间,从外面看不到里面到底住的什么(也可能住着一个人啊,或者就是一个其它什么动物啊),因此不行。但第三行等同于告诉系统,房间里就是住的Dog类型的来宾,因为有了这条“确保”,因此可以让其进入到了Dog类型的房间。同理:



我们可以得到一个结论:VS在调用某个对象的属性或方法的时候,考虑到的不是该对象是什么,而是该对象住在哪里(存在于什么类型的内存中)。或者换句话说,一个对象的可用属性和方法,取决于其变量类型。(形象点说就是,当VS需要“狗”去缉毒的时候,它不是命令说“喂,狗,去缉毒!”,而是命令说“喂,住在狗那屋子里的,去缉毒!”)



----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: