Java抽象类和抽象方法详解
一 . 由来
当编写一个类时,常常会给这个类定义一些方法来描述这个类的行为方式,通常这些方法都有相应的具体的方法体,但是,在某些情况下,某个基类只是知道其子类应该包含怎样的方法,却无法准确地知道这些子类如何实现这些方法。例如:定义了一个 Shape (图形)类,这个类应该提供一个计算周长的方法 getPerimeter ( ) ,但是不同 Shape 子类对周长的计算方法是不一样的,这个时候就需要子类自己去实现。可能有人会这么想:在 Shape 类实现 getPerimeter ( ) 方法,然后让其子类继承后再覆盖不就好了吗?确实,这样能实现,但是会让代码变得很混乱,不利于代码的重构。这时,抽象类和抽象方法就变得很重要了。
二 . 抽象方法
1 . 抽象方法的定义:
抽象方法仅有声明而没有方法体。
2 . 抽象方法声明语法:
abstract void f ( ) ; 。
3 . 抽象方法的规则:
- 抽象方法必须使用 abstract 修饰符来修饰。
- 抽象方法不能有方法体。
三 . 抽象类
1 . 抽象类定义:
包含抽象方法的类叫抽象类。抽象类里可以没有抽象方法。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。(否则,编译器就会报错。)
2 . 抽象类语法:
只需要在普通类上增加 abstract 修饰符即可。
3 . 抽象类的规则:
- 必须使用 abstract 修饰符来修饰。
- 不能被实例化,也就是无法使用 new 关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类里不包含抽象方法,这个抽象类也不能创建实例。
- 抽象类可以包含成员变量,方法(普通方法和抽象方法都可以),构造器,初始化快,内部类(接口,枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
- 含有抽象方法的类(包括直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。
三 . 抽象类和抽象方法的意义
创建抽象类和抽象方法可以使类的抽象性明确起来,并告诉用户和编译器打算怎么使用它们。抽象类还是很有用的重构工具,因为它们使得我们可以很容易地将公共方法沿着继承层次结构向上移动。