当前位置: 首页 > news >正文

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 则是对象排序的标准方式。合理运用这三者,能让代码更具扩展性和可维护性。

http://www.dtcms.com/a/589055.html

相关文章:

  • springboot移动端购物系统设计与实现(代码+数据库+LW)
  • 说一下Redis为什么快
  • web网页开发,在线%台球俱乐部管理%系统,基于Idea,html,css,jQuery,jsp,java,ssm,mysql。
  • 【C++STL】入门不迷路:容器适配器 + deque+stack/queue 使用 + 模拟实现指南!
  • 做设计挣钱的网站备案的网站有什么好处
  • 项目环境变量配置全攻略
  • AIGC|深圳AI优化企业新榜单与选择指南
  • 小红书MCP服务器 - 技术架构深度解析
  • 003-HTML之表单
  • 湖南省网站集约化建设实施方案做网站里面的图片像素要求
  • x402 生态系统:Web3 与 AI 融合的支付新基建
  • Rust 练习册 :掌握文本处理与词频统计
  • SpringCloud01-初识微服务SpringCloud
  • Web3 与去中心化应用(dApp)学习分享:从基础到应用
  • 贵州省住房和城乡建设厅官网站首页本地如何安装wordpress
  • 使用 dash 构建整洁架构应用
  • Transofrmer架构详解与PyTorch实现(附代码讲解)
  • 【自用】Python二分查找写法
  • 云原生爬虫:使用Docker和Kubernetes部署与管理分布式爬虫集群
  • Rust与Go:现代系统编程语言的深度对比
  • 国外html5网站源码网络舆情应急处置预案
  • 第1篇:Linux工具复盘上篇:yum与vim
  • Linux复习:gdb调试深度解析:debug与release
  • 哪家网站开发公司好平台公司信用评级
  • 【JavaEE】Spring Web MVC(下)
  • Hello-Agents第一章深度解析:智能体的本质、构建与实践
  • 【JAVA全栈项目】弧图图-智能图床SpringBoot+MySQL API接口结合Redis+Caffeine多级缓存实践解析
  • Linux复习:冯·诺依曼体系下的计算机本质:存储分级与IO效率的底层逻辑
  • 浅析MyBatisPlus 核心执行流程
  • 网站前台 后台建网站怎么搭建自己的服务器