抽象类必须用abstract修饰且不可实例化;含abstract方法的类须声明为abstract,但abstract类可无抽象方法;abstract方法不能是private或static,且无方法体;子类须实现所有abstract方法或自身声明为abstract。

抽象类必须用 abstract 修饰,且不能被实例化
Java 中只要类里有一个 abstract 方法,整个类就必须声明为 abstract;反过来,abstract 类可以没有抽象方法,但依然禁止 new 实例化。常见错误是写了个 abstract class Animal,然后在测试里直接 new Animal(),JVM 立刻抛 java.lang.InstantiationError。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 抽象类本质是“模板契约”,只提供骨架和部分实现,具体行为留给子类补全
- 如果只是想约束子类必须实现某些方法,但又不希望父类完全空着,就用
abstract方法 + 普通方法混合写法 - 注意:
abstract类可以有构造器(供子类super()调用),但它自己永远不执行
abstract 方法不能有方法体,也不能是 private 或 static
定义 abstract void speak(); 是合法的,但写成 private abstract void speak(); 或 static abstract void speak(); 会编译失败——前者子类根本看不见,后者跟“抽象”语义冲突(static 属于类,不依赖实例,而抽象方法恰恰要靠子类实例去实现)。
实操建议:
立即学习“Java免费学习笔记(深入)”;
-
abstract方法默认是public或protected,省略访问修饰符时按包内可见处理,但显式写public更稳妥 - 别试图在抽象方法里写
{}或return,那不是抽象方法,是语法错误 - 接口里的
default方法和static方法是另一套逻辑,别和抽象类里的abstract方法混用场景
子类继承抽象类必须实现所有 abstract 方法,或自身也声明为 abstract
比如 class Dog extends Animal,而 Animal 有 abstract void move(); 和 abstract void eat();,那么 Dog 必须重写这两个方法,否则编译报错:Dog is not abstract and does not override abstract method eat() in Animal。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 如果子类暂时不想实现全部抽象方法(比如做中间基类),就老老实实加
abstract class Dog extends Animal - IDE 通常能自动提示未实现方法并生成存根,但要注意它可能漏掉重载变体或泛型擦除后的方法签名
- 抽象方法的参数类型、返回类型、异常声明必须严格一致,协变返回类型(如子类方法返回更具体的子类)仅适用于非抽象的重写方法
抽象类 vs 接口:选哪个取决于“有没有共享状态和行为”
抽象类可以有字段、构造器、protected 方法、甚至 final 方法;接口只能有 public static final 字段和 public abstract 方法(以及 default/static)。如果你需要子类共用一个 id 字段、一个初始化逻辑、或一套校验流程,抽象类更自然;如果只是能力契约(比如 Comparable、Runnable),接口更轻量。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- Java 8+ 允许接口有
default方法,但无法解决“共享可变状态”的问题——抽象类仍是唯一能持实例字段的选项 - 一个类只能继承一个抽象类,但可以实现多个接口,设计时先想清楚“is-a”关系是否强到需要单继承结构
- 别为了“看起来更面向接口”硬把本该是抽象类的逻辑塞进接口,后期加字段或修改构造逻辑时会非常痛苦










