面向对象(二) 继承/里氏替换
父类:基类
子类:派生类
继承的概念:
1.传递性:子类能继承父类的所有方法、属性
2.单根性:类只能继承一个父类
继承的注意的问题:
1.创建子类对象的时候,会为子类与父类的对象的字段提供空间
2.父类不能继承子类
3.构造方法不能被继承,但是可以在子类用添加 base(指定引用)
4.子类能继承父类的属性与方法、但是私有的方法只能被继承,不能被使用
5.基本格式:
子类:父类 base("构造方法")
6.基本的访问修饰符
public 公开的类 任何都能访问
prive 私有的类 只能在类中进行访问
protected 受保护的类 只能在本类或者子类进行访问
二:里氏替换
概念:父类引用可以指向一个子类,看到的也只是父类的引用
2.里氏替换的原则:
父类不能替换成子类
子类能替换成父类
Parent p=new Son()
Son s=(Son)p; --正确
Parent p=new Parent()
Son s=(Son)p; --错误
注:因为继承的概念就是子孙类会越来越比祖先类详细,所以可以将子孙类强制转换成祖先类,因为祖先有的行为子孙类示例都有了(重新定义的或者是默认的);但是当将祖先类示例强制转换成子孙类示例的时候,一些子孙类有的行为祖先是没有的(即使的是默认的实现也没有)。
7.过程:创建子类的时候先条用子类的构造函数,然后再调用父类的构造函数
执行父类的构造函数后,再执行子类的构造函数。
1.父类引用能引用到子类的父类引用,可以看到,但是无法使用。
例:
a(父类引用)se(子类对象)=new se();
2.1 子类可以访问包括父类的引用以及自己的属性
se(子类) ss=new se();
3.如果需要父类访问到子类的字段,必须要转换
4.转换的方式有两种:
1.(子类类型) 父类引用 //会报错
2.父类引用 as 子类类型 //不会报错、但是会返回一个null值
5.判断父类的对象引用类型,父类引用 is 子类类型 并且返回一个布尔值
例:if(数组[i] is pe)
{
((pe)数组(I).方法/属性)
}