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

Java 抽象类(Abstract Class)详解

在 Java 中,抽象类是一种特殊的类,它不能被实例化,但可以被子类继承。抽象类的主要目的是提供一种模板,定义一些通用的方法和属性,同时允许子类根据需要实现具体的逻辑。抽象类是实现数据抽象的一种重要手段,通过隐藏复杂的代码实现细节,只向用户提供必要的信息。

抽象类的特点

  1. 模板

    • 抽象类提供了一种模板,定义了一些方法和属性,但这些方法的具体实现可以由子类完成。
    • 开发者可以隐藏复杂的代码实现,只向用户提供必要的信息。
  2. 松耦合

    • 数据抽象通过减少依赖关系,实现了松耦合,使得系统更加灵活和可维护。
  3. 代码复用

    • 使用抽象类可以节省时间,避免重复编写相同的代码。抽象方法可以在需要的地方被调用。
  4. 抽象

    • 抽象类帮助开发者隐藏代码的复杂性,只保留项目中必要的特性,使用户更容易理解和使用。
  5. 动态解析

    • 通过支持动态方法解析,开发者可以使用一个抽象方法解决多种问题。

抽象类的声明语法

要声明一个抽象类,需要使用 abstract 关键字,并且可以包含抽象方法和非抽象方法。

<Access_Modifier> abstract class <Class_Name> {// 数据成员// 语句// 方法
}

抽象类的示例

// 抽象类 Person
package abstraction;public abstract class Person {private String name;private String gender;public Person(String name, String gender) {this.name = name;this.gender = gender;}public abstract void work();@Overridepublic String toString() {return "Name=" + this.name + "::Gender=" + this.gender;}public void changeName(String newName) {this.name = newName;}public void exam() {// TODO Auto-generated method stub}public void office() {// TODO Auto-generated method stub}
}// 子类 Employee
package abstraction;public class Employee extends Person {private int empId;public Employee(String name, String gender, int empId) {super(name, gender);this.empId = empId;}public void office() {if (empId == 0) {System.out.println("Employee Logged Out");} else {System.out.println("Employee Logged In");}}public static void main(String[] args) {Person employee = new Employee("Pavithra", "Female", 1094826);employee.office();employee.changeName("Pavithra Tripathy");System.out.println(employee.toString());}@Overridepublic void work() {// TODO Auto-generated method stub}
}
输出
Employee Logged In
Name=Pavithra Tripathy::Gender=Female

声明抽象类的规则

  1. 必须使用 abstract 关键字

    • 声明抽象类时,必须使用 abstract 关键字。
  2. 不能直接实例化

    • 抽象类不能直接实例化,只能通过子类实例化。
  3. 至少包含一个抽象方法

    • 抽象类中可以包含抽象方法和非抽象方法,但至少需要有一个抽象方法。
  4. 可以包含构造器和静态方法

    • 抽象类可以包含构造器和静态方法。

实现抽象的两种方式

  1. 抽象类

    • 使用抽象类实现数据抽象,定义一些通用的方法和属性,具体实现由子类完成。
  2. 接口

    • 接口也是一种实现抽象的方式,定义方法签名但不提供具体实现。

接口与抽象类的区别

特点接口抽象类
关键字interfaceabstract
实现方式子类实现接口子类继承抽象类
多重实现可以实现多个接口只能继承一个抽象类
支持多重继承支持不支持

抽象类的优点

  1. 代码简洁

    • 抽象类有助于编写更简洁的代码。
  2. 避免代码重复

    • 抽象类避免了代码重复,提高了代码的可维护性。
  3. 代码复用

    • 抽象类提供了代码复用的机制,子类可以继承和重用父类的方法和属性。
  4. 内部实现变化不影响外部

    • 抽象类的内部实现可以变化,而不会影响到使用它的类。

抽象类的缺点

尽管抽象类在 Java 编程中提供了许多优势,如代码复用、松耦合和数据抽象,但它们也带来了一些潜在的缺点。开发者在设计系统时需要权衡这些优缺点,选择最适合项目需求的设计方案。理解抽象类的局限性有助于更好地利用其优点,同时避免或减轻其带来的负面影响。以下是抽象类的主要缺点:

  1. 单继承限制

    • 只能继承一个抽象类:Java 中一个类只能继承一个父类。这意味着如果一个类已经继承了一个抽象类,就不能再继承另一个抽象类。这限制了类的设计灵活性,特别是在需要从多个源继承功能的情况下。
  2. 成本较高

    • 处理不必要的复杂情况:抽象类可能需要处理一些在实际应用中并不需要的复杂情况,这会增加开发和维护的成本。例如,如果一个抽象类定义了许多方法,而某些子类只需要其中的一部分,那么这些子类就需要实现那些不必要的方法,这会导致代码冗余和维护困难。
    • 过度设计:过度使用抽象类可能导致系统设计过于复杂,增加了学习和理解的难度,尤其是在大型项目中。
  3. 测试难度增加

    • 单元测试复杂:抽象类的存在使得单元测试变得更加复杂。由于抽象类本身不能被实例化,测试时需要创建具体的子类,这增加了测试的复杂性和工作量。
    • 依赖性增加:抽象类通常与其他类有紧密的依赖关系,这使得在测试时需要模拟更多的依赖,增加了测试的难度。
  4. 设计灵活性受限

    • 难以更改设计:一旦定义了抽象类并被多个子类继承,更改抽象类的设计可能会导致大量的代码改动。这使得在项目后期对抽象类进行重大修改变得困难。
    • 限制了接口的使用:虽然抽象类可以提供一些默认实现,但它们不能像接口那样灵活。接口可以被多个类实现,而抽象类只能被一个类继承。

总结

抽象类是 Java 中实现数据抽象的重要工具,通过隐藏复杂的代码实现细节,只向用户提供必要的信息,提高了代码的可维护性和复用性。理解抽象类的声明和使用规则,以及它与接口的区别,对于编写高质量的 Java 代码非常重要。

以下是本文重点内容总结:

什么是抽象类?

抽象类(Abstract Class)是 Java 中实现抽象的一种方式。抽象类使用 abstract 关键字声明,不能被实例化,但可以被子类继承。抽象类的主要目的是提供一个模板,定义一些通用的方法和属性,同时允许子类根据需要实现具体的逻辑。

抽象的实现方式

在 Java 中,抽象可以通过以下两种方式实现:

  1. 抽象类(Abstract Class)
  2. 接口(Interface)
抽象类(Abstract Class)
定义
  • 抽象类是使用 abstract 关键字声明的类。
  • 抽象类不能被实例化,但可以被子类继承。
  • 抽象类可以包含抽象方法(没有实现的方法)和非抽象方法(有实现的方法)。
语法
<access_modifier> abstract class ClassName {// 数据成员// 非抽象方法// 抽象方法
}
特点
  • 模板:抽象类提供了一种模板,定义了一些通用的方法和属性,具体实现由子类完成。
  • 松耦合:通过减少依赖关系,实现了松耦合,使得系统更加灵活和可维护。
  • 代码复用:抽象类可以包含非抽象方法,提供默认实现,子类可以直接使用或重写这些方法。
  • 动态解析:通过支持动态方法解析,开发者可以使用一个抽象方法解决多种问题。
规则
  • 必须使用 abstract 关键字声明抽象类。
  • 抽象类不能直接实例化,只能通过子类实例化。
  • 抽象类可以包含抽象方法和非抽象方法。
  • 抽象类可以包含构造器和静态方法。
  • 如果一个类包含一个或多个抽象方法,则该类必须声明为抽象类。
接口(Interface)
定义
  • 接口是使用 interface 关键字声明的类。
  • 接口不能被实例化,但可以被类实现。
  • 接口中所有方法默认都是 publicabstract 的(Java 8 以后可以有默认方法和静态方法)。
语法
<access_modifier> interface InterfaceName {// 常量// 抽象方法// 默认方法(Java 8+)// 静态方法(Java 8+)
}
特点
  • 多重实现:一个类可以实现多个接口,从而获得多重继承的效果。
  • 松耦合:接口定义了行为规范,但不提供具体实现,使得实现类更加灵活。
  • 代码复用:接口可以包含默认方法和静态方法,提供默认实现,实现类可以直接使用这些方法。
规则
  • 必须使用 interface 关键字声明接口。
  • 接口不能直接实例化,只能被类实现。
  • 接口中所有方法默认都是 publicabstract 的(Java 8 以后可以有默认方法和静态方法)。
  • 接口中的变量默认是 publicstaticfinal 的。
抽象类与接口的区别
特点抽象类接口
关键字abstractinterface
实现方式子类继承抽象类子类实现接口
多重实现只能继承一个抽象类可以实现多个接口
支持多重继承不支持支持
方法实现可以包含抽象方法和非抽象方法只能包含抽象方法(Java 8 以前),Java 8 以后可以包含默认方法和静态方法
构造器和静态方法可以包含构造器和静态方法不能包含构造器,但可以包含静态方法
抽象类优点
  1. 代码简洁
    • 抽象类和接口有助于编写更简洁的代码。
  2. 避免代码重复
    • 抽象类和接口避免了代码重复,提高了代码的可维护性。
  3. 代码复用
    • 抽象类和接口提供了代码复用的机制,子类可以继承和重用父类的方法和属性。
  4. 内部实现变化不影响外部
    • 抽象类和接口的内部实现可以变化,而不会影响到使用它们的类。
抽象类缺点
  1. 单继承限制
    • 抽象类只能被一个类继承,限制了类的设计灵活性。
  2. 成本较高
    • 抽象类可能需要处理一些在实际应用中并不需要的复杂情况,增加了开发和维护的成本。
  3. 对象关系阻抗不匹配
    • 在使用关系型数据库管理系统(RDBMS)时,对象模型和关系模型之间可能存在不匹配的问题。
  4. 对象关系映射
    • 在使用 ORM 框架时,需要进行对象关系映射,增加了系统的复杂性。
  5. 测试难度增加
    • 抽象类和接口的存在使得单元测试变得更加复杂。

http://www.mrgr.cn/news/70615.html

相关文章:

  • 力扣 LeetCode 206. 反转链表(Day2:链表)
  • idea的mapper.xml文件里写sql语句出现Tag name expected错误提示
  • 常用字符串和集合处理工具类
  • 一个win32 / WTL下多线程库(CThread类)的使用心得
  • 刘知远LLM——大模型微调:prompt-learningdelta tuning
  • SpringCloud篇(服务提供者/消费者)(持续更新迭代)
  • 生产与配置
  • 前端知识点---Javascript中检测数据类型函数总结
  • HTML常用标签
  • Python 多进程日志管理:最佳实践与实战指南
  • 图像增强的100种方法
  • 【AI学习】Mamba学习(十五):关于S4模型计算优化的再学习
  • http协议与内外网的划分
  • 【论文阅读】医学SAM适配器:适应医学图像分割的任意分割模型
  • glsl中vec4是行矩阵还是列矩阵
  • 满200减30,怎么样用python计算凑单正好满足要求呢?
  • [DEBUG] 服务器 CORS 已经允许所有源,仍然有 304 的跨域问题
  • 重构代码之移动字段
  • FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
  • 【科研积累】大模型的认知笔记
  • AUTOSAR_EXP_ARAComAPI的7章笔记(2)
  • Bililive-go开源录屏工具:本地部署远程管理精彩直播不在错过
  • 【韩老师零基础30天学会Java 】06章 数组、排序和查找
  • 常用的损失函数pytorch实现
  • Oracle OCP认证考试考点详解082系列18
  • 代码随想录算法训练营Day14 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度