抽象类的概念
Java中允许在类中只声明方法而不提供方法的实现。这种只有声明而没有方法体的方法成为抽象方法,而包含一个或者多个抽象方法的类称为抽象类。
抽象方法是通过指定abstract关键字来创建。抽象方法没有内容,因此不需要被父类执行,所以子类必须重写抽象方法。
抽象方法声明如下:
abstract returnType abstractMethod([paramlist]) ;
其中没有方法体,必须子类继承并且重写。
abstract只能用于普通方法,它不能用于static方法或者类的构造方法。
抽象类声明如下:
abstract class AbstractClass{
...
}
抽象类包含一个或者多个抽象方法,必须在class前使用abstract关键字将类声明为抽象类,抽象类也可以包含一些非抽象的方法,例外的是,没有抽象方法的类也可以通过添加abstract关键字将其声明为抽象类。(这种类型的类往往没有必要定义任何抽象方法,但是设计者又想要禁止创建该类的实例化对象,此时只需要在类的声明前加上abstract关键字即可)。
一个抽象类只关心是否具有某种功能,而不关心功能的具体实现,功能的具体行为和属性由子类负责实现。所以抽象类没有自己的实例化对象,在编译时,使用new创建抽象类实例化对象会报错。
注意:如果定义了一个抽象类,当子类继承一个抽象类时,子类要重写父类中的所有抽象方法,否则需要将子类也声明为abstract抽象类。
利用抽象类实现多态
abstract class Animal{
abstract void breathe(); //抽象方法
abstract void move(); //抽象方法
public void breed() {
System.out.println("动物会繁衍生息"); //普通方法
}
}
class Dog extends Animal {
void breathe() {
System.out.println("狗狗用肺呼吸"); //父类抽象方法重写
}
void move() {
System.out.println("狗狗用四条腿跑"); //父类抽象方法重写
}
}
class Fish extends Animal {
void breathe() {
System.out.println("鱼儿用鱼鳃呼吸"); //父类抽象方法重写
}
void move() {
System.out.println("鱼儿会游泳"); //父类抽象方法重写
}
}
//测试类
public class TextAbstract {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal = new Dog(); //上溯造型对象
animal.breed(); //调用从父类继承的成员方法
animal.breathe(); //调用子类Dog中重写的抽象方法
animal.move();
Fish fish = new Fish(); //调用子类Fish
fish.breed();
fish.breathe();
fish.move();
}
}
/**
动物会繁衍生息
狗狗用肺呼吸
狗狗用四条腿跑
动物会繁衍生息
鱼儿用鱼鳃呼吸
鱼儿会游泳
*/
抽象类的作用
抽象类不能实现实例化对象,程序中定义抽象类的目的是为同一类对象建立抽象的模板,在同类对象所对应的类体系中,抽象类往往在顶层中。这样可以使类的设计更加清晰,同时也为类的体现提供通用的接口。这些接口反映了同一类对象的共同特征。定义了抽象类后,可以利用Java的多态性,通过抽象类的通用接口处理类体系中的所有类。
定义抽象类和抽象方法是向用户和编译器表明该类的作用和用法,使类体系设计更加清晰,并支持多态。