Java抽象类的案例
抽象类的特点总结
不能实例化:抽象类不能直接创建实例。它只能被继承。即,你不能用
new
关键字创建抽象类的对象。可以包含抽象方法:抽象类可以包含一个或多个抽象方法(没有方法体),这些方法必须在子类中实现。抽象方法的定义是
abstract
关键字修饰的。可以包含普通方法:除了抽象方法,抽象类还可以包含已实现的方法,即普通方法。这些方法可以被子类继承和使用,或者被重写(覆盖)。
可以有构造函数:抽象类可以有构造函数,构造函数通常在子类实例化时被调用,用于初始化抽象类的一些状态。
可以包含字段:抽象类可以有字段(成员变量),并且这些字段可以被子类继承和访问。
可以实现接口:抽象类可以实现一个或多个接口,但它不需要实现接口中的所有方法,子类需要提供具体的实现。
可以有访问修饰符:抽象类可以具有访问修饰符(如
public
,protected
,private
),这决定了它的访问级别和子类访问的权限。抽象类主要用于设计一个类的基础结构,并允许子类实现具体的细节。这种设计模式常用于模板方法模式、工厂模式等场景中。
1. 基本的抽象类示例
abstract class Animal {// 抽象方法,没有实现abstract void makeSound();// 普通方法,有实现void eat() {System.out.println("This animal is eating.");} }class Dog extends Animal {@Overridevoid makeSound() {System.out.println("Bark");} }class Cat extends Animal {@Overridevoid makeSound() {System.out.println("Meow");} }public class Main {public static void main(String[] args) {Animal myDog = new Dog();myDog.makeSound(); // Output: BarkmyDog.eat(); // Output: This animal is eating.Animal myCat = new Cat();myCat.makeSound(); // Output: MeowmyCat.eat(); // Output: This animal is eating.} }
abstract class Beverage {// 模板方法final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}// 具体的步骤private void boilWater() {System.out.println("Boiling water");}private void pourInCup() {System.out.println("Pouring into cup");}// 抽象方法,由子类实现abstract void brew();abstract void addCondiments(); }class Tea extends Beverage {@Overridevoid brew() {System.out.println("Steeping the tea");}@Overridevoid addCondiments() {System.out.println("Adding lemon");} }class Coffee extends Beverage {@Overridevoid brew() {System.out.println("Dripping coffee through filter");}@Overridevoid addCondiments() {System.out.println("Adding sugar and milk");} }public class Main {public static void main(String[] args) {Beverage tea = new Tea();tea.prepareRecipe();Beverage coffee = new Coffee();coffee.prepareRecipe();} }