Java 面向对象进阶:抽象类、接口与 Comparable 接口
Java-day16
引入
在 Java 面向对象编程中,抽象类和接口是实现“代码抽象与解耦”的核心工具,而 Comparable 接口则是实现“对象排序”的标准方式。本文将围绕这三大知识点,从定义与特点、实战应用到异同对比,全面解析其设计逻辑与使用场景,帮助读者掌握 Java 面向对象进阶的关键技能。
一、抽象类:类的“设计模板”
1.1 抽象类的定义与特点
- **定义**:被 abstract 修饰的类称为**抽象类**,被 abstract 修饰的方法称为**抽象方法**(无方法体,仅声明)。
- **核心特点**:
- 抽象类**不能实例化**(无法用 new 创建对象),但可用于**多态**(父类引用指向子类对象);
- 抽象方法**必须在抽象类中声明**,子类继承抽象类时**必须重写所有抽象方法**(除非子类也是抽象类);
- 抽象类可包含**普通方法(带方法体)**和**成员变量**;
- abstract 与 final、private、static 冲突(final 禁止重写/继承,private 子类无法访问,static 属于类而抽象方法需子类实现)。
1.2 抽象类实战示例
```java
package com.qcby;// 抽象类:作为父类模板public abstract class Base {// 普通方法(带方法体)public void run() {System.out.println("run");}// 抽象方法(无方法体,子类必须重写)public abstract void show();}// 子类:继承抽象类并实现抽象方法class Child extends Base {@Overridepublic void show() {System.out.println("子类实现抽象方法 show");}}
// 测试类public class Test {public static void main(String[] args) {// 多态:父类引用指向子类对象Base base = new Child();base.run(); // 调用父类普通方法base.show(); // 调用子类重写的抽象方法}}```
**输出**:
run
子类实现抽象方法 show
二、接口:行为的“规范契约”
2.1 接口的定义与特点
- **定义**:接口是对“行为”的抽象,用 interface 关键字声明,其中的方法默认是 public abstract(Java 8 后可含默认方法和静态方法)。
- **核心特点**:
- 接口**不能实例化**,但可用于**多态**;
- 类可**实现多个接口**(解决 Java 类单继承的限制),接口之间可**多继承**;
- 实现类必须**重写接口的所有抽象方法**(除非实现类是抽象类);
- 接口中的成员变量默认是 public static final(常量)。
2.2 接口实战示例
```java
package com.qcby;// 接口1:定义“吃饭”行为interface Eat {void eat();}// 接口2:定义“睡觉”行为interface Sleep {void sleep();}// 类实现多个接口class Person implements Eat, Sleep {@Overridepublic void eat() {System.out.println("人吃饭");}@Overridepublic void sleep() {System.out.println("人睡觉");}}// 测试类public class Test {public static void main(String[] args) {// 多态:接口引用指向实现类对象Eat eat = new Person();eat.eat();Sleep sleep = new Person();sleep.sleep();}}```
**输出**:
人吃饭
人睡觉
三、Comparable 接口:对象排序的“标准协议”
3.1 Comparable 接口的作用
Comparable 接口是 Java 提供的“**对象排序协议**”,实现该接口的类可以通过 compareTo() 方法定义自身的排序规则,从而支持集合(如 TreeSet、TreeMap)或数组的自动排序。
3.2 Comparable 实战示例(对象按属性排序)
```java
package com.qcby;import java.util.Arrays;// 实现 Comparable 接口,定义排序规则class Person implements Comparable {String name;int age;int height;public Person(String name, int age, int height) {this.name = name;this.age = age;this.height = height;}// 按身高升序排序(身高相同则按年龄升序)@Overridepublic int compareTo(Person o) {if (this.height != o.height) {return this.height - o.height;}return this.age - o.age;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + ", height=" + height + "}";}}
// 测试类public class Test {public static void main(String[] args) {Person p1 = new Person("小花", 18, 180);Person p2 = new Person("小王", 19, 180);Person p3 = new Person("小赵", 20, 170);// 数组排序(依赖 Comparable 接口)Person[] persons = {p1, p2, p3};Arrays.sort(persons);for (Person p : persons) {System.out.println(p);}
// TreeMap 排序(Key 依赖 Comparable 接口)java.util.TreeMap treeMap = new java.util.TreeMap<>();treeMap.put(p1, "A");treeMap.put(p2, "B");treeMap.put(p3, "C");System.out.println(treeMap);}}```
**输出**:
Person{name='小赵', age=20, height=170}
Person{name='小花', age=18, height=180}
Person{name='小王', age=19, height=180}
{Person{name='小赵', age=20, height=170}=C, Person{name='小花', age=18, height=180}=A, Person{name='小王', age=19, height=180}=B}
四、抽象类与接口的异同对比
特性 | 抽象类 | 接口 |
定义关键字 | abstract class | interface |
继承 / 实现方式 | 单继承( extends ) | 多实现( implements ) |
方法类型 | 可包含普通方法、抽象方法 | 默认为抽象方法(Java 8+ 可含默认方法、静态方法) |
成员变量 | 可包含普通变量 | 默认为 public static final 常量 |
设计意图 | 对 “类” 的抽象,提取共性代码 | 对 “行为” 的抽象,定义规范契约 |
实例化限制 | 不能实例化 | 不能实例化 |
多态支持 | 支持(父类引用指向子类) | 支持(接口引用指向实现类) |
五、总结:抽象类、接口与 Comparable 的核心要点
1. **抽象类**:
- 是类的设计模板,包含普通方法和抽象方法;
- 不能实例化,用于多态,子类必须重写抽象方法。
2. **接口**:
- 是行为的规范契约,仅含抽象方法(Java 8+ 扩展了默认方法);
- 支持多实现、多继承,实现类必须重写所有抽象方法。
3. **Comparable 接口**:
- 定义对象的排序规则,实现类通过 compareTo() 方法指定排序逻辑;
- 支持 TreeSet、TreeMap 和 Arrays.sort() 的自动排序。
通过本文的学习,相信你已对 Java 抽象类、接口和 Comparable 接口有了全面理解。在实际开发中,抽象类适合提取“类的共性”,接口适合定义“行为规范”,而 Comparable 则是对象排序的标准方式。合理运用这三者,能让代码更具扩展性和可维护性。
