上一节课我们学习了Java中的继承语法,以及如何继承中的方法重写和super()关键字,今天我们将学习一下如何阻止继承以及抽象类。

课程内容

阻止继承:final类和方法

有些时候我们希望阻止某个类被继承,不允许扩展的类可以定义为final类。在定义类的时候使用final关键字来修饰,语法如下:

public final class Executive{}

类中的特定方法也可以被声明为final。如果这样做,子类就不能覆盖这个方法。final类中的所有方法都会自动生成为final方法,语法如下:

public class Executive{
  public final int getAge()
  {
  }
}

前面我们说过域也可以定义为final,对于final域来说,构造对象之后就不允许修改值了。final类只会把方法生成为final,而域不会被设置。

为什么要使用final关键字?

将方法或者类声明为final的主要目的是:确保父类不会在子类中改变定义,String类声明为final类,不允许定义String的子类,也就是说如果有一个String类的引用,他引用的一定是String对象,而不是其他类的对象。

抽象类

先看一下抽象类的示意图:

java jf禁止拉伸 java阻止_python

什么是抽象类?

使用abstract关键字声明的方法称为抽象方法,包含一个或者多个抽象方法的类称为抽象类,必须使用abstract关键字修饰类。

为什么要使用抽象类?

抽象类可以总结出子类的通用方法,定义为抽象方法。

疑问与解惑

我在学习的过程中,一直有一个疑问,不知道大家有没有和我一样的想法?普通类也可以继承父类,也可以把通用的方法放到父类,实现代码复用,为什么还要用抽象类?思考一下!

很多博客在阐述继承优点时,大多都在讲复用,而真正的优点在于定义一个抽象类类型的引用P,可以通过P引用子类所实现的抽象方法。

还有一个优点就是,如果我们没有使用抽象类,那么子类可以不重写父类的方法,而使用抽象类普通类必须实现父类的所有抽象方法。

看一下下面的代码,我们通过抽象类实现一个播放器:

先定义一个抽象类:

java jf禁止拉伸 java阻止_python_02

抽象类中定义抽象的play方法,所有播放插件实现此方法进行播放。

java jf禁止拉伸 java阻止_python_03

java jf禁止拉伸 java阻止_抽象类_04

测试类:

java jf禁止拉伸 java阻止_抽象方法_05

输出结果:

java jf禁止拉伸 java阻止_java jf禁止拉伸_06

我们可以直接使用player引用来调用子类的play方法,进行播放。

特性

抽象方法,没有方法体,且抽象方法必须为Public修饰

java jf禁止拉伸 java阻止_java_07

抽象类不能被实例化。也就是说如果一个类声明为abstract,那么这个类就不能创建对象。

抽象类中可以包含非抽象方法,但如果一个类中的所有方法都是非抽象方法,那这个类没有任何意义。

普通类继承抽象类,必须实现抽象类中的所有抽象方法。

抽象类继承抽象类,不需要实现所有抽象方法。

小结

其实Java的面向对象看了不下三遍,其中Java编程思想一书中关于抽象也读过不下两次,每次都是似懂非懂,看完就忘了。学完本次课程,再加上播放器的简单Demo,对Java中的抽象类才算真正的理解了。