一,抽象类

问题: 星沐生态农场”游戏中,以下代码是否存在问题?

  1. Crop crop= new Crop();
  2. crop.print();
  3. 12

分析: 实例化Crop对象无意义,因为农作物是一个抽象的概念,而不是具体的某个实例对象。

JavaOOP 抽象类和接口 - 图1

方案: 使用抽象类

二、抽象类 (abstract)

语法:

  1. [访问修饰符] abstract class <类名> {
  2. //省略代码……
  3. }

示例:

  1. public abstract class Crop {
  2. //省略代码……
  3. }

测试:

1648876254320

结论:

抽象类不能被实例化(Crop is abstract; cannot be instantiated)

三、抽象方法

什么是抽象方法?

  • 使用abstract关键字修饰的方法称之为抽象方法
    • 抽象方法没有方法体
    • 抽象方法必须在抽象类里
    • 抽象方法必须在子类中被实现,除非子类是抽象类

语法:

  1. [访问修饰符] abstract class 类名 {
  2. [访问修饰符] abstract <返回类型> <方法名>([参数列表]);
  3. }

示例:

  1. //抽象类
  2. public abstract class Crop {
  3. //抽象方法,只有方法的声明,没有方法体中具体的实现
  4. public abstract void print();
  5. //普通方法
  6. public void test(){
  7. }
  8. }

结论

  1. 有抽象方法的类必然是抽象类。
  2. 但抽象类中的方法并不一定都是抽象方法。
  3. 抽象方法只有方法声明,无具体实现

四、抽象类和抽象方法的应用

抽象类的优势

  • 提高可重用性
    • 抽象类可以看作是类的一个模版,定义了子类的行为,可以为子类提供默认实现,无需子类中重复实现这些方法
  • 代码松耦合,更易于维护
    • 子类可以分别实现抽象父类中定义的抽象方法,将方法定义和方法实现的分离
  • 方便实现多态
    • 抽象类作为继承关系下的抽象层,不能被实例化,通常定义抽象类类型变量,其具体引用是实现抽象类的子类对象
      抽象类的应用场合
    • 抽象类用来列举一个类所需要的共性行为
    • 抽象类不明确提供具体实现方法
    • 抽象类必须由其子类实现它的抽象方法(除非子类也具有抽象性)

抽象类与抽象方法使用总结

  • 抽象方法只有方法声明,没有方法实现
  • 有抽象方法的类必须声明为抽象类
  • 子类必须重写所有的抽象方法才能实例化;否则,子类也必须声明成抽象类
  • 抽象类中可以没有、有一个或多个抽象方法,甚至可以定义全部方法都是抽象方法
  • 抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用
    • 不是由private修饰构造方法,可以被其子类的构造方法调用
  • abstract可以用来修饰类和方法,不能用来修饰属性和构造方法