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

抽象类的特点

抽象类的特点

抽象类是面向对象编程中的一个重要概念,它具有以下主要特点:

基本定义

  • 使用abstract关键字修饰的类

  • 不能被实例化(不能创建对象)

  • 可以包含抽象方法和非抽象方法

核心特点

  1. 不能实例化

    abstract class Animal { }
    // Animal a = new Animal(); // 编译错误,不能实例化抽象类

  2. 可以包含抽象方法

    • 抽象方法只有声明没有实现

    • 使用abstract关键字修饰

    • 抽象方法必须在子类中被实现(除非子类也是抽象类)

    abstract class Animal {public abstract void makeSound(); // 抽象方法
    }

  3. 可以包含具体实现的方法

    abstract class Animal {public void eat() { // 具体方法System.out.println("动物进食");}
    }

  4. 可以包含成员变量

    abstract class Animal {protected String name; // 成员变量
    }

  5. 构造方法

    • 可以有构造方法(虽然不能直接实例化)

    • 用于子类实例化时初始化抽象类的成员变量

    abstract class Animal {protected String name;public Animal(String name) { // 构造方法this.name = name;}
    }

  6. 继承关系

    • 必须被继承才能使用

    • 子类必须实现所有抽象方法(除非子类也是抽象类)

    class Dog extends Animal {@Overridepublic void makeSound() { // 实现抽象方法System.out.println("汪汪汪");}
    }

与接口的区别

特性抽象类接口
关键字abstract classinterface
方法实现可以有具体方法和抽象方法Java 8前只能有抽象方法
变量可以有各种类型变量默认public static final常量
构造方法可以有不能有
多继承不支持(单继承)支持(多实现)
设计目的代码复用和扩展定义行为和规范

使用场景

  1. 作为基类:当多个类有共同特征和行为时

  2. 部分实现:当需要提供部分实现,但保留部分行为由子类决定时

  3. 模板方法模式:定义算法框架,具体步骤由子类实现

  4. 代码复用:当多个子类需要共享相同的方法实现时

示例代码

abstract class Shape {protected String color;public Shape(String color) {this.color = color;}// 抽象方法public abstract double area();// 具体方法public String getColor() {return color;}
}class Circle extends Shape {private double radius;public Circle(String color, double radius) {super(color);this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}public class Main {public static void main(String[] args) {Shape circle = new Circle("红色", 5.0);System.out.println("颜色: " + circle.getColor());System.out.println("面积: " + circle.area());}
}

http://www.xdnf.cn/news/69499.html

相关文章:

  • 面经-浏览器/网络/HTML/CSS
  • 单页面应用的特点,什么是路由,VueRouter的下载,安装和使用,路由的封装抽离,声明式导航的介绍和使用
  • 数据结构之二叉树
  • 线性回归之多项式升维
  • TDengine 存储引擎设计
  • map和set的使用
  • PHP日志会对服务器产生哪些影响?
  • 安恒安全渗透面试题
  • [PTA]2025 CCCC-GPLT天梯赛-这不是字符串题
  • 29-JavaScript基础语法(函数)
  • JavaScript 中的单例模式
  • AI Agent开发第34课-用最先进的图片向量BGE-VL实现“图搜图”-下
  • C# 的 字符串插值($) 和 逐字字符串(@) 功能
  • 高效Java面试题(附答案)
  • 鸿蒙系统的 “成长烦恼“:生态突围与技术迭代的双重挑战
  • KRaft面试思路引导
  • Linux环境准备(安装VirtualBox和Ubuntu,安装MySQL,MySQL启动、重启和停止)
  • promise.resolve,promise.reject,promise.all的理解和运用
  • Java 性能优化:从硬件到软件的全方位思考
  • 深入解析 Python 函数:从基础到进阶
  • Python利用shp文件裁剪netcdf文件
  • Linux-scp命令
  • 高尔夫球规则及打法·棒球1号位
  • 软件模块设计质量之内聚
  • 大模型AI的运行逻辑与准确性保障机制——以DeepSeek与豆包为例
  • 当socket的状态为SOCK_SYNSENT时,不可能同时存在Sn_IR_TIMEOUT中断标志被置位的情况
  • 基于SpringBoot的高校体育馆场地预约管理系统-项目分享
  • jinjia2将后端传至前端的字典变量转换为JS变量
  • 使用 Flutter 遇坑小计
  • 经典文献阅读之--SSR:(端到端的自动驾驶真的需要感知任务吗?)