抽象类用abstract声明,不可实例化,可含抽象方法、普通方法和字段;子类必须实现全部抽象方法或声明为abstract;与接口相比,抽象类支持单继承、有构造器,适合表达is-a关系。

在 Java 中,用 abstract 关键字声明抽象类,表示这个类不能被实例化,仅作为其他类的父类提供通用结构和部分实现。
抽象类的基本声明方式
使用 abstract 修饰符放在 class 前面即可:
<font color="#0066cc">abstract</font> <font color="#0066cc">class</font> Animal {<br> <font color="#0066cc">public</font> <font color="#0066cc">abstract</font> <font color="#0066cc">void</font> makeSound();<br> <font color="#0066cc">public</font> <font color="#0066cc">void</font> sleep() {<br> System.out.println("Sleeping...");<br> }<br>}
注意:抽象类可以包含抽象方法(无方法体,必须由子类实现),也可以包含普通方法(已有实现)和字段。
抽象类的使用限制
- 不能用 new 直接创建抽象类的对象,例如 new Animal() 会编译报错
- 抽象类可以有构造方法,但只供子类调用(通过 super())
- 子类继承抽象类时,必须实现所有抽象方法,否则子类也必须声明为 abstract
- 抽象类可以不包含抽象方法(极少用,但语法允许)
子类如何正确继承并实现抽象类
子类用 extends 继承抽象类,并覆盖全部抽象方法:
立即学习“Java免费学习笔记(深入)”;
<font color="#0066cc">class</font> Dog <font color="#0066cc">extends</font> Animal {<br> <font color="#0066cc">@Override</font><br> <font color="#0066cc">public</font> <font color="#0066cc">void</font> makeSound() {<br> System.out.println("Woof!");<br> }<br>}
之后就可以创建子类实例:Dog dog = new Dog();,并调用 makeSound() 和继承来的 sleep()。
抽象类 vs 接口的关键区别
- 抽象类支持单继承,但可包含构造器、普通方法、静态方法、成员变量(含非 public)
- 接口默认方法是 public abstract,字段是 public static final;Java 8+ 支持 default 和 static 方法
- 一个类只能 extends 一个抽象类,但可以 implements 多个接口
- 抽象类更适合表达“是什么”(is-a 关系),如 Dog is an Animal;接口更适合表达“能做什么”(capability)


















