一、 抽象类的定义
抽象类是用 abstract
关键字修饰的类。它不能被实例化,通常作为其他类的基类(父类)。
[访问修饰符] abstract class 类名 {
// 类体
}
示例:
public abstract class Animal {
// 抽象类可以包含普通方法、抽象方法、属性等
public void sleep() {
System.out.println("Animal is sleeping");
}
// 抽象方法
public abstract void makeSound();
}
1.1 抽象类的特点
-
抽象类不能实例化
抽象类不能直接创建对象,只能通过子类来实例化。Animal animal = new Animal(); // 错误:抽象类不能实例化 Animal dog = new Dog(); // 正确:通过子类实例化
-
抽象类可以有任意成员
抽象类可以包含:普通方法(非抽象方法)、构造器、静态属性和抽象方法public abstract class Animal { // 普通方法 public void sleep() { System.out.println("Animal is sleeping"); } // 构造器 public Animal() { System.out.println("Animal constructor"); } // 静态属性 public static String type = "Mammal"; // 抽象方法 public abstract void makeSound(); }
二、 抽象方法的定义
抽象方法是用 abstract
关键字修饰的方法。它没有方法体(即没有实现),必须由子类重写。
[访问修饰符] abstract 返回类型 方法名(参数列表);
public abstract void makeSound(); // 抽象方法,没有方法体
2.1 抽象方法的特点
-
抽象方法不能有主体
抽象方法只有声明,没有实现(即没有方法体)。public abstract void makeSound(); // 正确 public abstract void makeSound() { } // 错误:抽象方法不能有主体
-
抽象方法不能用
final
、private
、static
修饰final
:抽象方法需要被子类重写,而final
方法不能被重写。private
:抽象方法需要被子类访问和实现,而private
方法不能被子类访问。static
:抽象方法依赖于实例,而static
方法不依赖于实例。
public abstract class Animal { // 以下写法都是错误的 public final abstract void makeSound(); // 错误:final 不能修饰抽象方法 private abstract void makeSound(); // 错误:private 不能修饰抽象方法 public static abstract void makeSound();// 错误:static 不能修饰抽象方法 }
三、 抽象方法与抽象类的关系
-
类中有抽象方法,该类一定是抽象类
如果一个类包含抽象方法,那么这个类必须声明为抽象类。因为如果一个类包含抽象方法,那么这个类无法提供完整的实现,因此不能直接实例化,而class Animal
的意思是可以实例化。public abstract class Animal { public abstract void makeSound(); // 抽象方法 }
-
抽象类中可以没有抽象方法
抽象类可以不包含抽象方法,但仍然不能实例化。public abstract class Animal { public void sleep() { System.out.println("Animal is sleeping"); } }
四、继承抽象类
当一个类继承抽象类时,它必须实现抽象类中的所有抽象方法,或者将自己也声明为抽象类。
-
实现所有抽象方法
子类必须实现父类中的所有抽象方法。public abstract class Animal { public abstract void makeSound(); } public class Dog extends Animal { @Override public void makeSound() { System.out.println("Woof!"); } }
-
声明为抽象类
如果子类没有实现父类的所有抽象方法,那么子类也必须声明为抽象类。public abstract class Animal { public abstract void makeSound(); } public abstract class Bird extends Animal { // 没有实现 makeSound(),所以 Bird 必须是抽象类 }
五、 抽象类 vs 接口
特性 | 抽象类 | 接口 |
---|---|---|
关键字 | abstract class | interface |
实例化 | 不能实例化 | 不能实例化 |
方法实现 | 可以包含普通方法和抽象方法 | Java 8 之前只能包含抽象方法 |
多继承 | 不支持(单继承) | 支持(多实现) |
构造器 | 可以有构造器 | 不能有构造器 |
成员变量 | 可以是普通变量 | 只能是常量(public static final ) |
设计目的 | 代码复用和层次化设计 | 定义规范和扩展功能 |