多态 :
1.理解多态性:可以理解为一个事物的多种形态,一个操作 不同的对象执行 产生的结果不一样。
2.何为多态性:对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
3.多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译,看左边;运行,看右边。
4.多态性的使用前提:①类的继承关系②方法的重写
实现多态的两种方式
1、使用父类作为方法的形式参数
2、使用父类作为方法的返回值
LSP 里式替换原则 子类可以替换父类
实现多态的三个要素:
1、必须要有继承关系
2、子类要重写父类的方法
3、父类引用指向子类对象
向上转型: 子转父 自动转
向下转型: 父转子 强制转换
场景:
父类对象中包含了子类对象 想调用子类对象中特有的方法时。
一般和instanceof运算符 搭配使用 清晰的知道父类对象中包含的子类对象 避免转换出错
instanceof关键子的使用:
a insetanceof A:判断对象a是否是类A的实例。如果是,返回true,如果不是返回false.
使用情景:为了避免在向下转型是出现ClassCastException的异常,我们在向下转型之前,先进行insetanceof的判断,一但返回true,就进行向下转型。如果返回false,不进行向下转型。
如果a insetanceof A 放回true,则a insetanceof B也返回true。
其中,类B是类A的父类
示例:
问题1:编译时通过,运行时不通过
举例1:
(父类)Person p3 = new (子类)Woman();
(子类)Man man = (Man)p3;
举例2:
Person p4 = new Person();
Man m4 = (Man)p4;
问题2:编译通过,运行时也通过
(祖先)Object obj = new Woman();
Person p = (Person)obj;
问题3:编译不通过
Man m5 = new Woman();
String str = new Date();