一、抽象方法与抽象类基础定义

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共用修饰方法。
 

更多推荐