Java 程序设计基础(第5章第4节)|抽象类与抽象方法
一、抽象方法与抽象类基础定义
1. 抽象方法:用abstract修饰,只有方法声明,没有方法体(没有{},直接分号结束);
2. 抽象类:包含一个及以上抽象方法的类,必须用abstract class修饰;
3. 核心目的:父类制定标准规范,强制子类按照规范实现功能。
二、抽象类硬性语法约束
1. 抽象类不能new实例化对象,只能被继承;
2. 普通非抽象子类继承抽象类,必须重写全部抽象方法;
3. 抽象子类继承抽象父类,可以不重写抽象方法,继续留给下级子类实现;
4. 抽象类可以拥有:普通成员变量、常量、普通成员方法、构造方法、静态方法。
三、代码演示:定义抽象类、抽象方法
// 抽象父类
abstract class Shape {
// 抽象方法:求面积,无方法体
public abstract double getArea();
// 普通方法
public void showInfo() {
System.out.println("这是一个几何图形");
}
}
// 圆形子类,必须重写抽象方法
class Circle extends Shape {
private double r;
public Circle(double r) {
this.r = r;
}
@Override
public double getArea() {
return Math.PI * r * r;
}
}
// 测试
public class AbstractDemo {
public static void main(String[] args) {
Shape circle = new Circle(2);
System.out.println("圆形面积:" + circle.getArea());
circle.showInfo();
}
}
四、抽象类也有构造方法
很多初学者误以为抽象类不能实例化就没有构造方法,实际抽象类可以定义构造方法,作用是:子类构造执行时,通过super调用抽象父类构造,初始化父类成员变量。
abstract class Person {
String name;
// 抽象类构造方法
public Person(String name) {
this.name = name;
}
public abstract void work();
}
class Teacher extends Person {
public Teacher(String name) {
super(name);
}
@Override
public void work() {
System.out.println(name + "正在授课");
}
}
五、实用案例:模板方法设计模式雏形
抽象父类固定整体执行流程,把可变步骤定义为抽象方法交给子类实现:
abstract class Cook {
// 固定整体做菜流程,final防止子类重写流程
public final void doCook() {
prepare();
cooking();
dishUp();
}
private void prepare() {
System.out.println("备菜、清洗食材");
}
// 可变步骤交给子类实现
public abstract void cooking();
private void dishUp() {
System.out.println("装盘上菜");
}
}
class CookTomato extends Cook {
@Override
public void cooking() {
System.out.println("翻炒西红柿鸡蛋");
}
}
六、常见误区总结
1. 抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类;
2. abstract不能和final同时修饰一个类(final类不能继承,矛盾);
3. abstract不能和private、static、native共用修饰方法。
更多推荐

所有评论(0)