今天给Java中的抽象方法、抽象类和接口知识点做一个小小的总结。
定义:Java中使用abstract关键字修饰的方法为抽象方法,抽象方法没有方法体。
PS: 抽象方法没有方法体,但反过来说只要没有方法体就是抽象方法这句话是错误的,Java中还有一类native方法(本地方法)没有方法体,比如public native hashCode()就是一个本地方法,该类方法其实是使用C++实现的,Java允许通过特定的方式来调用C++的方法。
定义:抽象类也是使用abstract关键字来声明的,它可以包含[0,n]个抽象方法,抽象类无法直接实例化对象,需要通过多态的方式实现,子类继承抽象类必须实现抽象类的所有抽象方法。
抽象类与普通类的区别: 抽象类可以看作是普通类的超集,普通类有的,抽象类全都有。普通类中的普通方法,构造方法,抽象类中全都可以存在,换句话说,抽象类就是比普通类多了一些抽象方法而已。
抽象类的使用原则:
1.被abstract定义的类称之为抽象类,抽象类无法直接实例化对象,可以通过向上转型进行实例化。
2.抽象类中可以没有抽象方法(抽象类包含[0,n]个抽象方法,即0个也行),但只要一个类中定义了抽象方法,则这个类一定是抽象类。
3.abstract和final以及private不能同时出现(抽象类无法直接实例化对象,需要通过多态来实现,而多态又依赖于继承和重写来实现,如果出现final关键字,则说明该类为最终类,没有子类,该方法为最终方法,无法重写;如果出现private关键字,则说明该类的方法无法跨类,只在类中可见,所有如果同时出现就会导致抽象类无法实例化对象)。
4.抽象类是普通类的超集,抽象类中仍然可以存在普通方法和构造方法,且子类实例化时仍然满足继承的原则,先调用父类的构造方法,再调用子类的构造方法。
5.抽象类A继承抽象类B,此时抽象类A,可以不重写抽象类B中的方法。如果是普通类继承,就得重写
那么有个问题,我们明明已经有了普通类和普通方法,为什么还需要抽象类和抽象方法呢?
解答:抽象类和抽象方法存在的意义就在于强制要求子类覆写某些方法,子类必须是满足继承关系才能继承抽象类,且一个子类只能继承一个抽象类(单继承局限)。
定义:接口是“更加纯粹的抽象类”,Java中使用interface来定义接口,接口中只有全局常量和抽象方法。
PS: 接口与接口之间可以使用extends关键字实现继承,接口的继承是多继承的(并不是所有的继承都是单继承的)。
接口的使用原则:
1.在Java中子类使用implements表示实现一个父接口,必须覆写接口中所有的抽象方法。
2.正因为接口中普遍只存在全局常量和抽象方法,因此,接口中方法的修饰public abstract、变量的修饰public static final统统可以省略不写,阿里编码规约也要求,接口中这些关键字都不出现。
3.接口也无法直接实例化对象,必须通过子类向上转型为其实例化。
4.一个子类可以同时使用implements关键字实现多个父接口(开发中的接口优先原则,优先考虑使用接口)。
JDK8中有关接口的扩展内容:从JDK8开始,接口中允许存在普通方法,接口中的普通方法使用default关键字(default主要用来告知编译器这是接口中的普通方法,其实际权限还是public)来定义,普通方法有方法体,子类实现接口后可以直接使用接口中的普通方法。