所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。


主要有以下优点:
可替换性:多态对已存在代码具有可替换性.
可扩充性:增加新的子类不影响已经存在的类结构.
接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的.
灵活性:
简化性:
虚拟机是如何实现多态的
动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法.如果你知道Hotspot中oop-klass模型的实现,对这个问题就了解比较深了.


向上转型(多态)

向上转型:(子类转为父类,自动转型)

格式 :父类类型 变量名 = new 子类类型();
Father father = new Son();

注:子类赋值给父类,但是此类是那这时这个父类就能调用子类重写父类的方法
但是无法调用子类特有的方法(父类没有这个方法,只有子类有)(需要向下转型才能调用)

可以调用:
1. 子类重写父类的方法
2. 父类的特有方法


向下转型(多态)

向下转型:(父类转为子类,强制转型)

格式: 子类类型 变量名 = (子类类型) 父类类型的变量;

向下转型可以调用:
1. 子类特有方法
2. 子类重写父类的方法
3. 父类特有的方法

在向下转型有两种情况:
情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。

Father father = new Son();

Son son = (Son) father;


情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误
Father father = new Father();

Son son = (Son) father; //会报错





注:这个只能转换上边那种是从子类转为父类的“形式父类”;

  而直接创建的父类对象,是无法向下转型的;也就是说调用的还是子类的方法而并不是父类的方法。

1.三个条件

继承的存在(继承是多态的基础,没有继承就没有多态)
子类重写父类的方法(多态下调用子类重写的方法)
父类引用变量指向子类对象(子类到父类的类型转换)



2.instanceof



java中,instanceof运算符的前一个操作符是一个引用变量,后一个操作数通常是一个类(可以是接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是返回true,否则返回false。