面向对象三大特征:封装性、继承性、多态性
extends继承或者implements实现,是多态性的前提。
小明是一个学生,但是同时也是一个人。分别是学生形态和人的形态,这个对象既是学生形态
也是人类形态。
代码中体现多态性,就是父类引用指向子类对象。
格式:
父类名称 对象名 = new 子类名称();
或者
接口名称 对象名 = new 实现类名称();
访问成员变量的两种方式:
1.直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
(因为左边是父类,所以只能调用父类的变量)
2.间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
(子类没有覆盖重写,就调用父类的;子类覆盖重写了,就调用子类的,还是本质上只能调用父类存在的方法)
访问成员方法的方式:
只能访问父类里面定义过的方法,如果父类的方法被子类覆盖重写,就调用子类的,否则就调用父类原有的。
使用多态的好处:
如果不用多态,只用子类,那么写法是:
Teacher one = new Teacher();
one.work();//讲课
Assistant two = new Assistant();
two.work()://辅导
但是老板不关心你是哪一种员工,只想让你工作。
因此使用多态就是:
Employee one = new Teacher();
one.work();//讲课
Employee two = new Assistant();
two.work();//辅导
好处:无论右边new什么样的子类,调用的方法都不会变化。
对象的向上转型,其实就是多态写法。
格式:父类名称 对象名 = new 子类名称();
含义:右侧创建一个子类对象,把他当做父类对象来看待使用。
*向上转型是安全的,从小范围到大范围
对象一旦向上转型为父类,就无法调用子类原本的内容
类似于:
double num = 100;//正确,int-->double 自动类型转换
对象的向下转型,其实是还原的动作。
格式 :子类名称 对象名=(子类名称) 父类对象;
含义:将父类对象,还原成原来的子类对象
Animal animal = new Cat();//本来是猫,向上转型为动物
Cat cat = (Cat)animal;//本来是猫,当做动物了之后还原为猫。
*本来是猫,才可以向下转型为猫!
如何才能知道一个父类的引用对象,本来是什么子类?
格式:
对象 instanceof 类名称
这将会得到一个boolean值
if(animal instance of Dog){
...
}
if(animal instance of Cat){
...
}