温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么理解Java抽象类

发布时间:2026-08-30 20:55:10 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

理解 Java 的抽象类(abstract class),可以从「它是什么、为什么用、怎么用、和接口的区别」这几个角度来把握。


一、什么是抽象类(概念)

抽象类是不能被实例化的类,通常用来:

  • 表达一类事物的公共抽象
  • 封装子类的公共属性和行为
  • 声明抽象方法,让子类去实现

关键字:abstract

abstract class Animal {
    String name;

    public void eat() {
        System.out.println("吃东西");
    }

    // 抽象方法,没有方法体
    public abstract void makeSound();
}

❌ 不能这样写:

Animal a = new Animal(); // 编译错误

✅ 但可以:

Animal a = new Dog();

二、抽象类的特点(重点)

1️⃣ 不能被实例化

new Animal(); // ❌ 错误

只能通过子类继承来使用。


2️⃣ 可以包含抽象方法

  • 抽象方法:没有方法体
  • 子类 必须实现所有抽象方法(除非子类也是抽象类)
abstract class Animal {
    abstract void makeSound();
}

3️⃣ 也可以包含普通方法

抽象类并不全是“抽象的”:

abstract class Animal {
    public void sleep() {
        System.out.println("睡觉");
    }

    abstract void makeSound();
}

✅ 子类可以直接继承 sleep()


4️⃣ 可以有构造方法

虽然不能 new,但构造方法仍然有意义

abstract class Animal {
    String name;
    Animal(String name) {
        this.name = name;
    }
}

子类构造时会调用父类构造:

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }
}

5️⃣ 一个类只能继承一个抽象类(单继承)

class Dog extends Animal { }

❌ Java 不支持多继承:

class Dog extends Animal, Cat ❌

三、为什么要用抽象类?

✅ 1. 表达“是什么”的关系(is-a)

Dog is an Animal

抽象类更适合表示一种类别


✅ 2. 代码复用(公共逻辑放父类)

abstract class Vehicle {
    public void start() {
        System.out.println("启动");
    }

    abstract void run();
}

子类只关心 run(),公共逻辑不用重复写。


✅ 3. 约束子类行为

通过抽象方法,强制子类实现某些方法

abstract void pay(); // 子类必须实现支付逻辑

四、抽象类 vs 接口(高频面试点)

对比点 抽象类 接口
是否可实例化
是否有普通方法 ✅(Java 8+ default)
是否有构造方法
成员变量 任意 默认 public static final
继承数量 单继承 多实现
关系语义 is-a can-do

一句话理解:

抽象类强调“是什么”,接口强调“能做什么”。


五、什么时候用抽象类?

✅ 使用抽象类,当:

  • 多个类有公共状态或行为
  • 有明显父子类关系
  • 希望在父类中提供部分实现

❌ 不适合:

  • 只想定义规范
  • 需要多继承
  • 更偏向能力而不是类别

六、一个完整示例

abstract class Shape {
    String color;

    Shape(String color) {
        this.color = color;
    }

    abstract double area();

    public void showColor() {
        System.out.println(color);
    }
}

class Circle extends Shape {
    double r;

    Circle(String color, double r) {
        super(color);
        this.r = r;
    }

    double area() {
        return Math.PI * r * r;
    }
}

七、一句话总结

抽象类是用来被继承的“半成品类”,它既定义了“是什么”,又规定了“必须做什么”。

如果你愿意,我也可以:

  • 生活化比喻 再讲一遍
  • 结合 面试题 给你总结
  • 对比 接口 + 抽象类一起用 的最佳实践
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI