第五章 继承、多态、抽象类与接口 (8)

        通常可以说四边形具有4条边,或者更具体一点,平行四边形是具有对边平行且相等特性的特殊四边形,等腰三角形是其中两条边相等的三角形,这些描述都是合乎情理的,但对于图形对象却不能使用具体的语言进行描述,它有几条边,究竟是什么图形,没有人能说清楚,这种类在Java中被定义为抽象类。

        5.8.1 抽象类与抽象方法

        在解决实际问题时,一般将父类定义为抽象类,使用这个父类时需要对其进行继承与多态处理。回想继承和多态原理,继承树中越是在上方的类越抽象,如鸽子类继承鸟类、鸟类继承动物类等。在多态机制中,并不需要初始化父类对象,需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化对象,因为图形类不能抽象出任何一种具体图形,但它的子类却可以。

        Java中定义抽象类时,需要使用abstract关键字,其语法如下:

[权限修饰符] abstract class 类名 {

类体

}

        使用abstract关键字定义的类称为抽象类,而使用abstract关键字定义的方法称为抽象方法,抽象方法的定义语法如下:

[权限修饰符] abstract 方法返回值类型 方法名(参数列表);

        抽象方法是直接以分号结尾的,它没有方法体,抽象方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上,抽象类除了被继承之外没有任何意义。 

        继承抽象类的所有子类都需要将抽象类中的抽象方法进行覆盖,这样在多态机制中,就可以将父类修改为抽象类。

        综上所述,使用抽象类和抽象方法时,需要遵循以下原则:

        (1)在抽象类中,可以包含抽象方法,也可以不包含抽象方法,但是包含了抽象方法的类必须被定义为抽象类。

        (2)抽象类不能直接实例化,即使抽象类中没有声明抽象方法,也不能实例化。

        (3)抽象类被继承后,子类需要实现其中所有的抽象方法。

        (4)如果继承抽象类的子类也被声明为抽象类,则可以不用实现父类中所有的抽象方法。

        使用抽象类时,可能会出现这样的问题:程序中会有太多冗余的代码,同时这样的父类局限性很大,例如,上面的例子中,也许某个不需要shop()方法的子类也必须重写shop()方法。如果将这个shop()方法从父类中拿出,放在别的类里,又会出现新问题,就是某些类想要实现“买衣服”的场景,竟然需要继承两个父类。

        Java中规定,类不能同时继承多个父类,面临这种问题时,接口的概念便出现了。

上一篇:kibana开启访问登录认证


下一篇:工程安全监测分析模型与智能算法模型方案