【Java面向对象】5-8 抽象类
§5-8 抽象类
面向对象的三大特性(封装、继承、多态)在前面的篇目中都已有介绍。本节将介绍面向对象中 “抽象的抽象”:抽象类。
5-8.1 抽象类的定义
语法:在类前显式声明 abstract
关键字。
class abstract class ClassName {
//类的成员
}
我们现在来定义一个抽象类:
public abstract class Test {
//抽象类
}
现在我们来为该类添加方法。
抽象类中也可以有抽象方法,用 abstract
修饰:
public abstract class Test {
public abstract void run();
}
抽象方法,顾名思义,由于其是抽象的,因此抽象方法没有实现。但这会导致一些问题:没有实现的方法是无法被调用的。为了解决这一问题,抽象类中的抽象方法必须由其子类实现:
public class TestSub extends Test {
@Override
public void run() {
//方法实现
}
}
抽象类的子类必须重写其父类中的所有抽象方法,提供具体的实现。而由于抽象父类中为该方法设置好了方法头(返回值类型、形参列表、函数名),子类要重写该方法则必须按照相同的方法头完成实现。因此,抽象方法的作用是约束子类重写的行为,可以被视为一种规范。
但并非所有抽象类的子类就必须重写父类的抽象方法,若抽象类的子类仍然是抽象类,那么子类可以不用重写:
public abstract class TestSub extends Test {
public abstract void run();
}
抽象类中可以包含抽象方法,抽象方法必须在抽象类中。以下为错误示例:
public class Test {
public abstract void run(); //错误:非抽象类中存在 abstract 方法
}
除了抽象方法,抽象类中也可以有具体方法。例如:
public abstract class Test {
public abstract void run(); //抽象方法
public void say() {
System.out.println("Say something"); //具体方法
}
}
5-8.2 抽象类的特点
- 抽象类其中既可以包含抽象方法,也可以含有普通(具体)方法。但将抽象方法没有实现;
- 抽象类的子类必须重写父类中所有抽象方法以提供实现,除非该子类也是抽象类;
- 抽象方法必须在抽象类中,用于提供方法的规范和约束;
- 抽象类无法被实例化(不允许使用
new
),但拥有构造器,非抽象子类实例化时需要调用父类构造器; - 不同于接口,一个类值可以继承一个类,因此也有且只有一个抽象类能由子类继承;
- 抽象类提高了程序的开发效率。