理解 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();
new Animal(); // ❌ 错误
只能通过子类继承来使用。
abstract class Animal {
abstract void makeSound();
}
抽象类并不全是“抽象的”:
abstract class Animal {
public void sleep() {
System.out.println("睡觉");
}
abstract void makeSound();
}
✅ 子类可以直接继承 sleep()。
虽然不能 new,但构造方法仍然有意义:
abstract class Animal {
String name;
Animal(String name) {
this.name = name;
}
}
子类构造时会调用父类构造:
class Dog extends Animal {
Dog(String name) {
super(name);
}
}
class Dog extends Animal { }
❌ Java 不支持多继承:
class Dog extends Animal, Cat ❌
Dog is an Animal
抽象类更适合表示一种类别。
abstract class Vehicle {
public void start() {
System.out.println("启动");
}
abstract void run();
}
子类只关心 run(),公共逻辑不用重复写。
通过抽象方法,强制子类实现某些方法:
abstract void pay(); // 子类必须实现支付逻辑
| 对比点 | 抽象类 | 接口 |
|---|---|---|
| 是否可实例化 | ❌ | ❌ |
| 是否有普通方法 | ✅ | ✅(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;
}
}
抽象类是用来被继承的“半成品类”,它既定义了“是什么”,又规定了“必须做什么”。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。