A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 边亮 中级黑马   /  2013-3-12 23:45  /  1648 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

父类:Person
子类:student
person per=new student();

子类可以赋值给父类;
如果父类中存储的是子类的对象,那么这个父类可以强制转换成子类;
这个要怎么理解;
说下里氏转换的转法跟作用;

3 个回复

倒序浏览
1、原则上是子类对象是可以赋值给父类对象的,即子类可以完全替换父类出现的地方,但是反过来父类对象不是替换子类对象的。我们把这种特性叫做里氏替换原则(LSP)
2、里氏替换原则有两个关键字:is和as
eg: is是用来检测对象是否与给定对象类型的兼容
class Program
    {
        static void Main(string[] args)
        {
            int i=3;
            string str="Hello World";
            if (i is string)
            {
                Console.WriteLine("是给定的类型");
            }
            else
            {
                Console.Write("不是给定的类型");
            }
        }
eg: as操作符类似于强制类型转换,但是转换失败的话不会报错,只会返回一个null值
class Program
    {
        static void Main(string[] args)
        {
            string str="Hello World";
            object s = str as object;
            if (s != null)
            {
                Console.WriteLine("转换成功!!!");
                Console.WriteLine(s.ToString());
            }
            else
            {
                Console.WriteLine("转换失败");
            }
        }
回复 使用道具 举报
第一个问题:里氏替换的解释:
里氏替换说的是父类引用指向子类实例;整个过程是这样的:
①new Student(),在堆上开辟一块空间存储student类型的对象;
②在栈上分配一块Person类的内存地址per;
③让per指向堆上的对象;
就这样实现了父类引用指向子类实例。
第二个问题:父类强转为子类
如果父类中存储子类的对象,即父类引用指向子类实例,因为子类继承了父类公开的属性和方法,
父类强制转换为子类,数据不会丢失;
相反,假设一种不可能发生的情形
如果是子类引用指向父类实例,将子类强制转换为父类,子类自己声明的属性和方法将会丢失。
以上,请参考。
回复 使用道具 举报
本帖最后由 曾玉锋 于 2013-3-13 18:30 编辑

file:///C:/.../Administrator/桌面/未命名.jpg
Person per=new Student();//per 指向 new Student() 这个对象,取名为S1
Student stu=(Student)per;//stu 也指向  new Student() 这个对象 S1
其实,per 和stu是对同一个对象的引用,所以可以进行互相转换。

里氏转换原则的好处:实现多态。
多态的表现形式是父类对象.父类的方法 而表现出子类对象的具体行为,父类对象引用不同的子类对象,也就表现出不同的行为。
所以,通常用父类对象作为方法的参数,使用的时候传递不同子类的对象,就会表现出不同的行为特征。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马