1、多态:实际上就是父类的引用指向子类的对象,但只能调用父类本身的方法、不能调用子类的方法。

     原因: 因为java程序分为编译阶段和编一阶段,在编译阶段也就是从打开程序到运行之前只能识别=左边的部分(前面的引用类型),并不会识别=右边(后面的对象)。只有在运行阶段才会识别=右边(后面的对象)。

例如:A a = new B();
编译阶段识别: a 是A类的引用
运行阶段识别:new出来的B对象

2、问题1:在多态下为什么只能直接调用父类有的方法,而不能直接调用子类特有的方法?

       原因:因为在编译的时候识别的知识前面的引用类型,不识别对象,所以只能识别出A里面的方法,而不能直接调用子类特有的方法。

3、多态的优点: 可以提高代码的复用性和扩展性,直接使用之前定义好的功能,后面可以在主类直接拿来使用,不在麻烦的再创建新的方法,并且方法的参数使用多态可以减少定义多个函数的麻烦,前提定义的功能可以被后期出现的对象使用。

4、多态的缺点:对象只能使用父类定义的方法(行为),不能使用子类特有的功能。

5、解决多态存在的缺点方法:对象转型

    向上转型:其实就是对象由子类类型转型为父类类型,即为向上转型

             特点:向上转型是一个隐式转换,相当于自动类型转换,不过向上转型后的对象只能访问父类中方法和定义的成员。

     向下转型:与向上转型相反,是对象由父类类型转型为子类类型,即为向下转型

            特点:向下转型是一个显示转换,类似于强制类型转换,有可能转型失败,不过向下转型后的对象可以访问子类特有的方法和定义的成员。所以向下转型之前,最好使用instanceof关键字进行类型检查。

    注意:向上向下转型的前提条件是 多态的前提下,在多态的前提下进行转型。

5、instanceof关键字

     instanceof是Java的保留关键字。作用是测试左边的对象是否是它右边的类的实例(大白话来说就是判断左边对象是否是右边类创建的,或者说左边不能是右边的子类,再或者说判断左边和右边是否有继承关系是否在同一个继承树上),返回值为boolean类型。

     这里说明下:

  •  类的实例包括本身的实例,以及所有直接或间接子类的实例
  • instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系 ,也就是说需要位于同一个继承树,否则就会编译错误。

6、多态中的方法重写

     特点:类似于继承的重写,如果向上转型后的对象调用父类的方法,若这个方法被子类重写了,就会调用子类的重写方法!

7、多态中父子类出现同名成员

  •      继承下的调用规则 
  •                成员变量: 调用子类的成员变量 成员方法:调用子类的方法,子类没有再去调用父类。
  •      多态下的调用规则
  •                成员变量:编译的时候看父类,运行结果也看父类
  •               非静态成员方法:编译时看父类,运行结果看子类(因为存在重写的情况)
  •                静态成员方法:编译时看父类,运行结果也看父类