生活中的人物视角
程序中的多态
概念:父类引用指向子类对象,从而产生多种形态
一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定
比如:dog继承了animal
怎么来理解这句代码的意思呢?
举一个例子:
short s = 10;
int num = s;
这两行代码的意思是:创建了个s变量,short类型的占2个字节,然后我们把s这个变量传递给了num,num这里是int类型的,占了4个字节 ,两行代码是可以正常运行的
我们想通过这两行代码表达的意思是:我们从小范围的数据传递给大范围的数据是不会出错的
这里的Animal是dog的父类,范围要比dog的范围大,所以这句代码是可以运行的
父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。
如果子类重写了父类的方法,那么在调用方法时,调用的是子类的重写的方法:官方话:实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行子类中的方法
多态的使用场景
场景一:使用父类作为方法形参实现多态
上面的省略的代码,都可以调用这么一块语句完成
场景二:使用父类作为方法的返回值实现多态,使方法可以返回不同的子类对象
向上转型(装箱):
Animal a = new Dog();
父类引用中保存真实的子类对象
把Dog转化成Animal
向下转型(拆箱):
比如我们用父类对象 创建了一个子类对象。父类对象只能调用父类的方法和对象以及子类中重写的方法,怎么办呢?我们想调用子类的对象
我们将a强转为子类对象,就可以调用子类的对象和方法了
向下转型的条件:先存在向上转型:Animal a = new Dog();才有后面的向下转型。向下转型必须转化为原来的类型
思考:在向下转型的时候如何判断出当前的类型呢?你怎么知道他原来的类型呢?这里就引出了Instance of关键字
引用 instance of 类型 // 返回布尔类型结果
总结:
父类引用指向子类的对象,从而产生多种形态。把子类当成父类来看
使用父类作为方法的形参,实现多态(喂养的方法)
使用父类作为方法返回值,实现多态(购买动物的方法)
Java多态的三个必要条件:
1、 继承
2、 子类重写父类方法
3、 父类引用指向子类对象