概念:
    一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
    示例:

    1. public abstract class Shape {
    2. public int width; // 几何图形的长
    3. public int height; // 几何图形的宽
    4. public Shape(int width, int height) {
    5. this.width = width;
    6. this.height = height;
    7. }
    8. public abstract double area(); // 定义抽象方法,计算面积
    9. }
    1. public class Square extends Shape {
    2. public Square(int width, int height) {
    3. super(width, height);
    4. }
    5. // 重写父类中的抽象方法,实现计算正方形面积的功能
    6. @Override
    7. public double area() {
    8. return width * height;
    9. }
    10. }
    1. public class Triangle extends Shape {
    2. public Triangle(int width, int height) {
    3. super(width, height);
    4. }
    5. // 重写父类中的抽象方法,实现计算三角形面积的功能
    6. @Override
    7. public double area() {
    8. return 0.5 * width * height;
    9. }
    10. }
    1. public class ShapeTest {
    2. public static void main(String[] args) {
    3. Square square = new Square(5, 4); // 创建正方形类对象
    4. System.out.println("正方形的面积为:" + square.area());
    5. Triangle triangle = new Triangle(2, 5); // 创建三角形类对象
    6. System.out.println("三角形的面积为:" + triangle.area());
    7. }
    8. }
    9. //输出结果
    10. //正方形的面积为:20.0
    11. //三角形的面积为:5.0

    抽象类总结:

    1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
    2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
    3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
    4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
    5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
    6. 抽象方法没有方法体。
    7. abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。
    8. 抽象类和抽象方法都要使用 abstract 关键字声明。
    9. 如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。而一个抽象类中,可以有 0~n 个抽象方法,以及 0~n 个具体方法。