【资料整理】多态
里氏替换原则:
(1)子类可以替换父类的位置,并且程序功能不受影响
(2)子类和父类存在同名成员的时候调用的是哪个成员?
父类 obj=new student(); //如果父类和子类存在同名成员时调用父类的成员
父类 obj=new student();//如果父类和子类存在不同名成员时根据类型指针先指向声明的类,如果类中没有则继续寻找它的父类;父类变量不能访问子类中特有的变量和方法
子类 obj=new student();//obj调用的是父类和子类的,如果是同名的则调用子类的
(3)new关键字的第二个作用,显示隐藏父类成员
如果子类与父类存在同名成员,子类会将父类的同名成员隐藏掉,通过new关键字显式隐藏
(4)根据变量类型判断可以调用的方法,如果子类里的方法与父类的方法在方法名相同且参数不同的情况下可以构成重载,根据所传的参数确定调用的方法
方法的重写、虚方法:
(1)用virtual修饰的方法称为虚方法,经常与override配合使用,只有被标记为virtual的方法才能被类重写,子类可以重写也可以不重写
如果子类重写了父类中的虚方法,调用的时候当发现父类的方法表中的这个方法是虚方法 那么就会去子类中寻找重写的方法,若重写了则调用,若子类中没有重写方法,则还是调用父类的虚方法
如果C:B B:A如果在对空间创建的C的对象 那么调用虚方法时 会先去找C是否重写 如果重写了 就调用C的重写方法 如果没有重写 再看B是否重写 如果重写调用B重写的方法 如果B没有重写 那么直接调用A的虚方法
(2)函数必须相同(返回值和函数名和参数列表)
(3)重写的函数修饰符必须大于父类
(4)重写的函数返回值必须与父类一致
(5)构造函数无法重写,不能被virtual修饰,不能继承(如果继承在父类里能初始化子类的对象了,且初始化之后变量不能确定是父类的还会子类的)(说法不准确)
(6)被sealed修饰的类叫做密封类,密封类是不能被继承的,不希望被继承的时候可以将类定义为密封类,被sealed修饰的重写的方法不能继续被其子类再重写,不能修饰字段,可以修饰类和方法
(7)虚方法不能被private访问修饰符修饰 (8)equals方法:
(1)是定义在object里面的一个虚方法,如果是值类型的比较的是变量的值,如果是引用类型,比较的是2个对象的引用地址,如果需要修改equals的比值方法可以在子类中重写改方法
(2)tostring也可以重写
多态:
(1)好处:易于维护,可扩展性
把不同的子类对象都当做父类来看,可以屏蔽不同的子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求不断的变化
(2)不同的事物对同一个行为作出不同的表现方式--多态
(3)如何实现多态:
a.基于继承关系
b.子类重写父类的虚方法
c.父类的变量指向子类的变量
d.将父类作为参数 实际上传递是子类对象
(4)工厂方法负责生产不同的子类,返回值是1个父类类型
(5)声明一个父类的变量,不关心具体创建的是哪个子类对象
(6)实现多态的方式:
a.通过父类实现多态
b.通过抽象实现多态