一、三大特征之三:多态
什么是多态? 基于继承/实现的前提下的一种现象,一定要方法的重写
格式:父类/接口 对象名 = new 子类对象
Demo
多态有哪些表现?对象和方法的多态(属性是没有多态的)
多态的好处:
1.方便实现方法的切换
2.可以作为方法的参数,接受不同的子类,提高代码的扩展性
多态的缺点:不能调用子类的特有的方法
例如
若需要调用,则需要强制转换
格式:子类 变量名 = (子类)父类对象
类型转换有几种形式?能解决什么问题?
自动类型转换、强制类型转换。
可以把对象转换成其真正的类型,从而解决了多态下不能调用子类独有方法的问题。
注意事项:
① 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。
② 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来
③ 建议在强转前使用instanceof去 判断当前对象的真实类型,再进行强转。
二、final
概念:表示最终的意思
应用:修饰变量、类、方法
修饰变量:
修饰类:代表最终类,不能被继承
修饰方法:表示最终的方法,不能被重写
应用场景:
模板方法设计模式:解决方法中存在重复代码的问题。
作用:抽取多个方法中相同的代码
步骤:① 定义一个抽象类 ② 在类中写一个模板方法(普通方法)用来存放相同代码,要用final ③ 定义抽象方法,不同的功能让子类去实现。
Demo
常量:
概念:被 static 和 final 修饰的变量
作用:记录一些系统的信息,或者特殊的数据,如公司的名称
好处:可读性好
命名规范:每个单词的每个字母都需要大写,多个单词之间通过下划线隔开
Public static final String SCHOOL_NAME = “民族高中”
三、抽象类
格式:public abstract class 类名{
//抽象方法
public abstract 返回值类型 方法名(参数); // 没有方法体
}
好处:在抽象类中定义抽象方法,强制子类去重写抽象方法,更好的实现多态
注意事项:①抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类 ② 抽象类不能创建对象,必须通过子类起继承抽象类 ③ 一个类继承了抽象类,一般要么重写所有的抽象方法,或者把这个类定义为抽象类
使用场景:如果想要子类有着和父类有一样的方法标签,就可以使用抽象类
Demo
子类一定要重写完父类的所有抽象方法
抽象类的好处:相同的代码抽取上来,更好的支持多态,提高代码的灵活性;当需求不明确的时候,设置抽象方法,然后具体的功能让子类来实现
能不能加上static 和 final:抽象方法需要被继承或者说重写,所以不能使用final
Static 可以通过 类名.方法名 去调用, 但是直接调用一个抽象方法是没有意义的
Private 表示私有的 不能被重写
四、接口
概念:接口就是一种特殊的结构,又或者理解成彻底的抽象类。
作用:起到约束的作用,让子类一定要去重写里面的方法。
使用:接口不看创建对象,需要一个类去实现(实现类)public class A implements 接口 B,接口C {}
什么时候用抽象类、什么时候使用接口?
当需要限制那个类使用时候,使用抽象类
一个类可以实现多个接口
接口的好处:可以多实现,扩展性强,可以让一个类具有更多的身份,其实就是多态;接口比较纯粹,在接口中定义的一般都是抽象方法。
Demo
创建三个接口,分别实现 唱歌、跳舞、rapper 三个功能
定义一个方法去实现
测试类