类,接口,抽象类

214 阅读3分钟

类、抽象类,接口


一、类(Class)

定义
类是所有面向对象编程的基础,它是一个模板蓝图,用于描述一类对象的共同属性和行为。

特点

  1. 实例化:可以直接通过 new 创建对象。
  2. 具体实现:类中的方法可以有具体实现。
  3. 继承:支持单继承(如 Java 中只能继承一个父类)。
  4. 成员变量:可以定义属性(字段)。

示例

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 之前)。接口强调“能做什么”,而不是“如何做”。

特点

  1. 不可实例化:不能通过 new 创建接口对象。
  2. 完全抽象(默认) :Java 8 前所有方法都是抽象的,Java 8+ 允许定义 default 方法和 static 方法。
  3. 多继承:一个类可以实现多个接口。
  4. 无状态:不能定义字段(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)

定义
抽象类是介于类和接口之间的存在,它可以包含抽象方法(无实现)和具体方法(有实现)。抽象类通常用于定义部分公共逻辑,但某些行为需要子类具体实现。

特点

  1. 不可实例化:不能通过 new 创建抽象类对象。
  2. 部分抽象:可以混合抽象方法和具体方法。
  3. 单继承:一个类只能继承一个抽象类(和普通类一样)。
  4. 可以有状态:可以定义字段和构造方法。

示例

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 前)
设计目的具体对象的模板定义部分公共逻辑定义行为契约
构造方法✅ 有✅ 有❌ 无

五、使用场景

    • 需要创建具体对象时。
    • 所有方法都有明确的实现。
  1. 抽象类

    • 多个子类有部分共同逻辑,但某些行为需要子类自定义。
    • 需要定义字段或构造方法时。
    • 适合“是什么”(is-a)的关系(如 Dog 是一种 Animal)。
  2. 接口

    • 定义行为规范,不关心具体实现。
    • 需要多继承(多实现)时。
    • 适合“能做什么”(can-do)的关系(如 USB 设备能传输数据)。

六、实际应用技巧

  1. 优先使用接口
    如果只是定义行为,优先选择接口(更灵活,支持多实现)。
  2. 抽象类用于代码复用
    如果多个子类有大量重复代码,可以用抽象类提取公共逻辑。
  3. 接口演化
    Java 8 后接口可以通过 default 方法添加新功能,而无需修改所有实现类。

七、一句话总结

  • :具体对象的模板,能实例化。
  • 抽象类:“部分实现”的模板,用于继承和代码复用。
  • 接口:纯粹的行为契约,定义“能做什么”。