1.多态实现必要的两个条件
1.必须满足继承关系 2.父类引用指向子类对象
2.向上转型和向下转型
1.向下转型的实现代码:

2.向下转型的实现代码 注意看注释

注意:必须要满足强制转换的条件
3.instanceof 运算符的使用
来判断左边的对象是否右边类的实例 如果结果正确 返回true 否则返回false
注意看代码的注释:

总结:
所谓向上转型 :父类引用指向子类实例 可以调用父类的方法 或者子类重写父类的方法。
向下转型 :将父类的引用在转换位子类的过程 向下转型过后 可以调用子类特有的方法和属性当然 向下转型不是谁都可以转换的 需要满足特点条件 这里我们可以使用instanceof来判断 左边的对象是否是右边类的实例。
父类的static方法 :只可以被子类继承使用 但不可以被重写。所以向上转型之后只能调用到父类原有的静态方法.
PS:
1.当父类和子类具有相同的非静态成员变量,那么在多态下访问的是父类的成员变量;
2.当父类和子类具有相同的静态变量,那么在多态下访问的是父类的静态成员变量;所以:父类和子类有相同的成员变量,多态下访问的都是父类的成员变量;
3.当父类和子类具有相同的非静态方法(就是子类重新父类的方法),多态下访问的是子类的成员方法。
4.当父类和子类具有相同的静态方法(就是子类重写父类的静态方法),多态下访问的是父类的静态方法.
4.抽象类和抽象方法
关键字:abstract
1.抽象类 在class 前面加上abstract 表示此类不可以被实例化 :

可以限制无意义的父类实例化 限制子类的随意性。
2.抽象方法 abstract 加在方法的返回值前面 称之为抽象方法
抽象方法在定义的时候 不允许包含方法体 而且子类必须重写父类的抽象方法当子类没有重写父类的抽象方法 子类必须也是抽象类

注意:抽象方法必须定义在抽象类中 ,抽象类中可以没有抽象方法. 当一个类中包含了抽象方法 子类必须去重写抽象方法.
static final private 不可以和abstract同时出现
5.接口的使用 interface
1.接口中常量和抽象方法的使用
实现接口的关键字 imlements 直接在类名后面加上 imlements 然后是你的接口名称

注意:类实现接口就必须重写接口中所有的方法 否则必须变成抽象类。

注意:接口中的方法默认是抽象方法 可以不去写抽象的关键字 系统会默认加上 。 接口中可以有很多抽象方法。
接口中可以包含常量, 常量会默认加上 public static fianl.
如果实现类中存在跟接口名一样的方法 在实现接口中的方法时 可以不用重写这个方法。
如果实现类中存在跟接口同名的信息 当我在程序当中 使用接口的引用指向是现实类的时候 打印输出的会是我接口中的信息。
2.接口中的默认方法和静态方法
默认方法 的关键字 default 返回值前面加上default 的作用目的:假如接口中有 a和b两个方法 但是你实现类只用到a 不回去用b 就可以在b方法的返回值前面加上default 这样不去重写 b 这个方法 实现类也不会报错.

注意:default 只是在jdk1.8新增的方法 如果使用1.8一下的 会报错.
default 可以在实现类中被重写 在调用的时候可以通过接口的引用去调用
接口中的 静态方法 不可以被重写 调用的时候使用接口名称调用
3.重名的方法在接口中的解决方案
如果实现类去实现多个接口中的方法的时候 存在重名的问题 实现类必须去重写这个满足自己特征的方法如果这个类以及继承父类 呢么这个实现类会默认去调用父类的重名方法.
4.接口中的常量和实现类以及父类中的 常量-属性重名的解决
当接口中的常量重名的时候 调用的时候只能通过接口名称.去指定。
当接口跟跟父类的常量或者属性重命名 子类只能在当前类下创建一个同名独有的成员 才能防止出现问题.
5.内部类

2.获取内部类实例的三种方式

.PS:区分抽象类与接口
1.子类只能继承一个抽象类,但是可以实现多个接口
2.接口中的方法都是抽象的,抽象类可以有非抽象方法
3.抽象类中的成员变量可以是各种类型,接口中的成员变量只能是静态的常量。
4.抽象类汇总可以有静态方法和静态代码块,接口中不可以
5.接口中没有构造方法,抽象类中可以存在构造方法