类、抽象类,接口
一、类(Class)
定义:
类是所有面向对象编程的基础,它是一个模板或蓝图,用于描述一类对象的共同属性和行为。
特点:
- 实例化:可以直接通过
new创建对象。 - 具体实现:类中的方法可以有具体实现。
- 继承:支持单继承(如 Java 中只能继承一个父类)。
- 成员变量:可以定义属性(字段)。
示例:
public class Dog {
// 属性(字段)
private String name;
// 构造方法
public Dog(String name) {
this.name = name;
}
// 具体方法
public void bark() {
System.out.println(name + ":汪汪!");
}
}
// 使用
Dog myDog = new Dog("小黑");
myDog.bark(); // 输出:小黑:汪汪!
二、接口(Interface)
定义:
接口是一种完全抽象的契约,它只定义方法的签名(名称、参数、返回类型),不包含方法的具体实现(Java 8 之前)。接口强调“能做什么”,而不是“如何做”。
特点:
- 不可实例化:不能通过
new创建接口对象。 - 完全抽象(默认) :Java 8 前所有方法都是抽象的,Java 8+ 允许定义
default方法和static方法。 - 多继承:一个类可以实现多个接口。
- 无状态:不能定义字段(Java 8 前),但可以定义常量(
public static final)。
示例:
public interface USB {
// 抽象方法(默认 public abstract)
void transferData();
// Java 8+ 的默认方法
default void plugIn() {
System.out.println("USB 已插入");
}
}
// 实现接口
public class Mouse implements USB {
@Override
public void transferData() {
System.out.println("传输鼠标点击信号");
}
}
// 使用
USB myMouse = new Mouse();
myMouse.transferData(); // 输出:传输鼠标点击信号
myMouse.plugIn(); // 输出:USB 已插入
三、抽象类(Abstract Class)
定义:
抽象类是介于类和接口之间的存在,它可以包含抽象方法(无实现)和具体方法(有实现)。抽象类通常用于定义部分公共逻辑,但某些行为需要子类具体实现。
特点:
- 不可实例化:不能通过
new创建抽象类对象。 - 部分抽象:可以混合抽象方法和具体方法。
- 单继承:一个类只能继承一个抽象类(和普通类一样)。
- 可以有状态:可以定义字段和构造方法。
示例:
public abstract class Animal {
// 字段
protected String name;
// 构造方法
public Animal(String name) {
this.name = name;
}
// 具体方法
public void eat() {
System.out.println(name + "正在吃饭");
}
// 抽象方法(无实现)
public abstract void makeSound();
}
// 继承抽象类
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + ":喵喵!");
}
}
// 使用
Animal myCat = new Cat("小白");
myCat.eat(); // 输出:小白正在吃饭
myCat.makeSound(); // 输出:小白:喵喵!
四、三者的核心区别
| 特性 | 类(Class) | 抽象类(Abstract Class) | 接口(Interface) |
|---|---|---|---|
| 实例化 | ✅ 可以 | ❌ 不能 | ❌ 不能 |
| 方法实现 | ✅ 全部具体 | ✅ 混合抽象和具体 | ❌ 默认抽象(Java 8 前) |
| 继承/实现 | 单继承 | 单继承 | 多实现 |
| 字段 | ✅ 可以有普通字段 | ✅ 可以有普通字段 | ❌ 只能有常量(Java 8 前) |
| 设计目的 | 具体对象的模板 | 定义部分公共逻辑 | 定义行为契约 |
| 构造方法 | ✅ 有 | ✅ 有 | ❌ 无 |
五、使用场景
-
类:
- 需要创建具体对象时。
- 所有方法都有明确的实现。
-
抽象类:
- 多个子类有部分共同逻辑,但某些行为需要子类自定义。
- 需要定义字段或构造方法时。
- 适合“是什么”(is-a)的关系(如
Dog是一种Animal)。
-
接口:
- 定义行为规范,不关心具体实现。
- 需要多继承(多实现)时。
- 适合“能做什么”(can-do)的关系(如
USB设备能传输数据)。
六、实际应用技巧
- 优先使用接口:
如果只是定义行为,优先选择接口(更灵活,支持多实现)。 - 抽象类用于代码复用:
如果多个子类有大量重复代码,可以用抽象类提取公共逻辑。 - 接口演化:
Java 8 后接口可以通过default方法添加新功能,而无需修改所有实现类。
七、一句话总结
- 类:具体对象的模板,能实例化。
- 抽象类:“部分实现”的模板,用于继承和代码复用。
- 接口:纯粹的行为契约,定义“能做什么”。