一,抽象类
问题: 星沐生态农场”游戏中,以下代码是否存在问题?
Crop crop= new Crop();
crop.print();
12
分析: 实例化Crop对象无意义,因为农作物是一个抽象的概念,而不是具体的某个实例对象。
方案: 使用抽象类
二、抽象类 (abstract)
语法:
[访问修饰符] abstract class <类名> {
//省略代码……
}
示例:
public abstract class Crop {
//省略代码……
}
测试:
结论:
抽象类不能被实例化(Crop is abstract; cannot be instantiated)
三、抽象方法
什么是抽象方法?
- 使用abstract关键字修饰的方法称之为抽象方法
- 抽象方法没有方法体
- 抽象方法必须在抽象类里
- 抽象方法必须在子类中被实现,除非子类是抽象类
语法:
[访问修饰符] abstract class 类名 {
[访问修饰符] abstract <返回类型> <方法名>([参数列表]);
}
示例:
//抽象类
public abstract class Crop {
//抽象方法,只有方法的声明,没有方法体中具体的实现
public abstract void print();
//普通方法
public void test(){
}
}
结论
- 有抽象方法的类必然是抽象类。
- 但抽象类中的方法并不一定都是抽象方法。
- 抽象方法只有方法声明,无具体实现
四、抽象类和抽象方法的应用
抽象类的优势
- 提高可重用性
- 抽象类可以看作是类的一个模版,定义了子类的行为,可以为子类提供默认实现,无需子类中重复实现这些方法
- 代码松耦合,更易于维护
- 子类可以分别实现抽象父类中定义的抽象方法,将方法定义和方法实现的分离
- 方便实现多态
- 抽象类作为继承关系下的抽象层,不能被实例化,通常定义抽象类类型变量,其具体引用是实现抽象类的子类对象
抽象类的应用场合 - 抽象类用来列举一个类所需要的共性行为
- 抽象类不明确提供具体实现方法
- 抽象类必须由其子类实现它的抽象方法(除非子类也具有抽象性)
- 抽象类作为继承关系下的抽象层,不能被实例化,通常定义抽象类类型变量,其具体引用是实现抽象类的子类对象
抽象类与抽象方法使用总结
- 抽象方法只有方法声明,没有方法实现
- 有抽象方法的类必须声明为抽象类
- 子类必须重写所有的抽象方法才能实例化;否则,子类也必须声明成抽象类
- 抽象类中可以没有、有一个或多个抽象方法,甚至可以定义全部方法都是抽象方法
- 抽象类可以有构造方法,其构造方法可以被本类的其他构造方法调用
- 不是由private修饰构造方法,可以被其子类的构造方法调用
- abstract可以用来修饰类和方法,不能用来修饰属性和构造方法