介绍
多态是继封装,继承之后的面对对象的第三大特征
多态指对于同一行为,针对不同的事物,须有不同的表现形式,在程序中,表示对同一方法,不同的对象有不同实现
多态的前提
继承或实现
父(类/接口)引用指向子(类/实现类)对象【体现格式】
方法的重写
多态的体现格式
父类/接口类型 对象名 = new 子类/实现类对象
常见的表现格式
普通父类引用指向子类对象
抽象父类引用指向子类对象
父接口引用指向实现类对象
访问特点
成员变量:编译看左边,运行看左边 (编译时看父类,运行时找父类)
成员方法:编译看左边,运行看右边 (编译时看父类,运行时找子类)
静态方法:编译看左边,运行看左边 (编译时看父类,运行时找父类)
常见的应用场景
变量多态的使用 同一个变量可以指向不同的子类或实现类对象
可以减少变量的定义
形参多态的使用 修饰符 返回值类型 方法名(父类/接口名 变量名){变量名。方法名}
让一个方法,接收不同的子类对象,减少了方法的定义
返回值类型多态的使用 修饰符 父类/接口名 方法(参数){return 子类/实现类对象;}
可以让一个方法,返回不同的子类对象,减少了方法的定义
多态的好处
可以将方法的参数或返回值类型定义为父类引用,使程序编写更简单,提高程序的灵活性,扩展性,复用性
多态的弊端
父类引用,无法访问子类/实现类的特有内容
引用类型转换
意义
由于多态的弊端,通过父类引用,不能调用子类/实现类的特有方法
类型转换分类
向上转型(多态体现格式):父类类型 变量名=new 子类类型()或子类对象
向下转型:子类类型 变量名 =(子类类型)父类变量名
类型转换存在的问题
当“两个类型不存在继承/实现关系” 或“子类引用指向父类对象” 会出现类型转换异常(ClassCastException)
解决方法:变量名 instanceof 数据类型 (判断变量名对应的对象所属的类型)
如果变量属于该数据类型,返回true
如果变量不属于该数据类型,返回false