📌 目录

  1. 什么是抽象类?
  2. 抽象类的特点
  3. 抽象类的声明与定义
  4. 抽象类与接口的区别
  5. 抽象类的应用场景
  6. 抽象类的实例化
  7. 抽象类的继承
  8. 示例代码
  9. 参考资料
  10. 出站链接

1. 什么是抽象类?

抽象类(Abstract Class) 是一种不能直接实例化的类。它可以包含抽象方法(没有方法体)和非抽象方法(有方法体)。抽象类的目的是提供一个通用的父类,供其他类继承,从而实现统一的接口和方法。

主要特点:

  • 不能实例化。
  • 可以包含抽象方法和非抽象方法。
  • 通过继承抽象类,子类必须实现所有的抽象方法,除非子类也是抽象类。
  • 抽象类可以有构造方法、字段和常量。

2. 抽象类的特点

  1. 不能实例化:抽象类不能直接创建对象,必须通过继承并实现其抽象方法的子类来实例化。
  2. 可以包含抽象方法:抽象方法是没有方法体的方法,子类必须实现这些方法。
  3. 可以包含非抽象方法:抽象类可以有完整的方法实现(非抽象方法),子类可以继承这些方法或重写它们。
  4. 构造方法:抽象类可以有构造方法,用于初始化子类对象。
  5. 字段和常量:抽象类可以有成员变量、常量和静态方法。

3. 抽象类的声明与定义

3.1 声明格式

抽象类的声明使用 abstract 关键字,格式如下:

abstract class ClassName {
    // 抽象类的成员变量、构造方法、非抽象方法和抽象方法
}

3.2 包含抽象方法

一个类如果包含抽象方法,那么这个类必须是抽象类。抽象方法没有方法体,只有方法签名。

abstract class Animal {
    abstract void makeSound();  // 抽象方法,没有方法体
}

3.3 包含非抽象方法

抽象类可以包含非抽象方法,这些方法可以被子类继承并使用,或者可以被子类重写。

abstract class Animal {
    abstract void makeSound();  // 抽象方法

    void sleep() {  // 非抽象方法
        System.out.println("动物在睡觉");
    }
}


4. 抽象类与接口的区别

特性抽象类接口
继承方式类继承类实现
方法实现可以包含抽象方法和非抽象方法只能包含抽象方法(Java 8 后接口可以有默认方法)
构造方法可以有构造方法没有构造方法
字段可以有实例变量和常量只能有常量(public static final)
访问修饰符可以有不同的访问修饰符所有方法默认是 public
继承关系类只能继承一个抽象类类可以实现多个接口

5. 抽象类的应用场景

  1. 模板方法模式:定义一个模板方法,在父类中定义基本操作,而将具体实现推迟到子类中。
  2. 共享代码:多个子类共享同一部分代码,减少代码重复。
  3. 无法实例化的父类:父类不希望被直接实例化,而是通过子类来实现其功能。

6. 抽象类的实例化

抽象类不能直接实例化。如果尝试直接实例化抽象类,编译时将抛出错误。必须通过子类实例化。

abstract class Animal {
    abstract void sound();
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();  // 错误:无法实例化抽象类
    }
}


7. 抽象类的继承

子类继承抽象类时,必须实现所有的抽象方法,除非子类也是抽象类。否则,编译时会报错。

abstract class Animal {
    abstract void sound();
}

class Dog extends Animal {
    void sound() {
        System.out.println("狗叫:汪汪");
    }
}

class Cat extends Animal {
    void sound() {
        System.out.println("猫叫:喵喵");
    }
}


8. 示例代码

示例 1:动物类的抽象实现

abstract class Animal {
    // 抽象方法
    abstract void makeSound();

    // 非抽象方法
    void eat() {
        System.out.println("动物在吃东西");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("狗叫:汪汪");
    }
}

class Cat extends Animal {
    void makeSound() {
        System.out.println("猫叫:喵喵");
    }
}

public class TestAbstractClass {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        dog.makeSound();  // 调用 Dog 的 makeSound 方法
        cat.makeSound();  // 调用 Cat 的 makeSound 方法

        dog.eat();  // 调用 Animal 类的 eat 方法
    }
}

输出

狗叫:汪汪
猫叫:喵喵
动物在吃东西

示例 2:带构造方法的抽象类

abstract class Animal {
    String name;

    // 抽象类的构造方法
    Animal(String name) {
        this.name = name;
    }

    abstract void makeSound();
}

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    void makeSound() {
        System.out.println(name + " 叫:汪汪");
    }
}

class Cat extends Animal {
    Cat(String name) {
        super(name);
    }

    void makeSound() {
        System.out.println(name + " 叫:喵喵");
    }
}

public class TestAbstractClass {
    public static void main(String[] args) {
        Animal dog = new Dog("狗");
        Animal cat = new Cat("猫");

        dog.makeSound();
        cat.makeSound();
    }
}

输出

狗 叫:汪汪
猫 叫:喵喵


9. 参考资料


10. 出站链接