上一节课咱们学习了Java中的继承语法,以及如何继承中的方法重写和super()关键字,今天咱们将学习一下如何阻止继承以及抽象类。java
有些时候咱们但愿阻止某个类被继承,不容许扩展的类能够定义为final类。在定义类的时候使用final关键字来修饰,语法以下:编程
public final class Executive{}学习
类中的特定方法也能够被声明为final。若是这样作,子类就不能覆盖这个方法。final类中的全部方法都会自动生成为final方法,语法以下:测试
public class Executive{ public final int getAge() { } }
前面咱们说过域也能够定义为final,对于final域来讲,构造对象以后就不容许修改值了。final类只会把方法生成为final,而域不会被设置。插件
将方法或者类声明为final的主要目的是:确保父类不会在子类中改变定义,String类声明为final类,不容许定义String的子类,也就是说若是有一个String类的引用,他引用的必定是String对象,而不是其余类的对象。code
先看一下抽象类的示意图: 对象
使用abstract关键字声明的方法称为抽象方法,包含一个或者多个抽象方法的类称为抽象类,必须使用abstract关键字修饰类。blog
抽象类能够总结出子类的通用方法,定义为抽象方法。继承
我在学习的过程当中,一直有一个疑问,不知道你们有没有和我同样的想法?普通类也能够继承父类,也能够把通用的方法放到父类,实现代码复用,为何还要用抽象类?思考一下!get
不少博客在阐述继承优势时,大多都在讲复用,而真正的优势在于定义一个抽象类类型的引用P,能够经过P引用子类所实现的抽象方法。
还有一个优势就是,若是咱们没有使用抽象类,那么子类能够不重写父类的方法,而使用抽象类普通类必须实现父类的全部抽象方法。
看一下下面的代码,咱们经过抽象类实现一个播放器:
先定义一个抽象类:
抽象类中定义抽象的play方法,全部播放插件实现此方法进行播放。
测试类:
输出结果:
咱们能够直接使用player引用来调用子类的play方法,进行播放。
抽象方法,没有方法体,且抽象方法必须为Public修饰
抽象类不能被实例化。也就是说若是一个类声明为abstract,那么这个类就不能建立对象。
抽象类中能够包含非抽象方法,但若是一个类中的全部方法都是非抽象方法,那这个类没有任何意义。
普通类继承抽象类,必须实现抽象类中的全部抽象方法。
抽象类继承抽象类,不须要实现全部抽象方法。
其实Java的面向对象看了不下三遍,其中Java编程思想一书中关于抽象也读过不下两次,每次都是似懂非懂,看完就忘了。学完本次课程,再加上播放器的简单Demo,对Java中的抽象类才算真正的理解了。