核心区别有三点:一是抽象类不能直接new实例而普通类可以;二是抽象类可含无实现的抽象方法,普通类方法必须有方法体;三是非抽象子类继承抽象类时必须实现其所有抽象方法。

核心区别就三点:能不能直接 new 出对象、方法能不能不写实现、子类继承时有没有强制要求。
能不能直接创建实例
普通类可以 new,比如 new Person()、new Dog(),一建好就能调用所有方法;抽象类禁止实例化,写 new Animal() 会编译报错——它不是用来造对象的,而是被继承的“骨架”。
方法是否允许没有具体实现
普通类所有方法都必须有方法体(哪怕只是空花括号 {});抽象类可以定义抽象方法,例如 public abstract void move();,没有 {},不写实现,只声明“这个功能你必须有”。子类要么实现它,要么自己也声明为抽象类。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
子类继承时的约束力不同
普通类作为父类,子类继承后可自由选择重不重写方法;抽象类作为父类,只要子类是普通类(非 abstract),就必须实现父类中所有抽象方法,否则编译不通过——这是编译器硬性检查,不是靠文档或约定。
成员变量和构造方法其实没区别
抽象类可以定义 private/protected/public 成员变量,也能写构造方法,子类通过 super() 调用完成初始化,这些和普通类完全一致。唯一差别是设计意图:抽象类里的变量常用于被子类共用或配合模板方法,而普通类的变量更偏向具体业务封装。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










