一、什么是抽象类
1.1抽象类的概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
1.2抽象类的作用
1.代码复用
抽象类可以包含一些通用的方法实现,这些方法可以被子类直接继承和使用,避免了代码重复。
2.强制规范
强制子类实现某些特定的方法。由于抽象类中存在抽象方法,子类必须实现这些方法,否则子类也必须被声明为抽象类。这确保了在不同的实现场景下,都有统一的接口和行为规范。
3.易于维护和扩展
当需要对一组相关类进行修改或扩展时,只需要在抽象类中进行修改,所有的子类都会自动继承这些修改。
二、抽象类定义
注意:抽象类的存在是为了被继承
2.1关键字abstract
public abstract class Test {
}
我们要用abstract关键字来定义抽象类和方法。
2.2 抽象类与普通类的区别
1.抽象方法可以没有具体实现,它的存在是为了规范子类的方法,因为子类必须重写这个方法,来实现对应子类的方法。
抽象方法是没有方法体的方法。它的存在是为了定义一种行为规范,让子类去具体实现这种行为。如果一个非抽象类中包含抽象方法,那么当尝试创建该类的对象时,由于无法确定如何执行抽象方法,就会导致错误。
2.抽象类无法被实例化
由上的介绍可知,抽象类是为了子类的规范而存在的,而且无法被实例化,所以抽象类无法被final修饰,方法也不可以被private修饰符修饰
final修饰词修饰抽象类报错:
private词修饰方法报错:
三、简单的抽象类代码运用
3.1课上例子:
定义两个类ChineseAirConditioner(Z国空调)和AmericanAirConditioner(M国空调),执行下面代码:
public class Main {
public static void main(String[] args) {
System.out.println("***测试中国空调***");
ChineseAirConditioner conditioner1 = new ChineseAirConditioner();
conditioner1.startUp();
conditioner1.displayStatus();
conditioner1.shutDown();
conditioner1.displayStatus();
System.out.println("***测试美国空调***");
AmericanAirConditioner conditioner2 = new AmericanAirConditioner();
conditioner2.startUp();
conditioner2.displayStatus();
conditioner2.shutDown();
conditioner2.displayStatus();
}
}
可产生如下输出:
***测试中国空调***
空调状态: 开启
空调状态: 关闭
***测试美国空调***
Air Conditioner Status: ON
Air Conditioner Status: OFF
我们可以先通过引入一个公共超类简化类定义中的重复代码,再简化main中的代码
首先定义一个公共超类:
public class Conditioner {
// 处理完全相同的代码=>定义公共超类
protected boolean isOn = false;
// protected: 本包和子类可以访问
public void startUp() {
isOn = true;
}
public void shutDown() {
isOn = false;
}
}
随后简化main代码:
public class Main {
private static void test(Conditioner conditioner) {
conditioner.startUp();
conditioner.displayStatus();
conditioner.shutDown();
conditioner.displayStatus();
// 不在Conditioner中写displayStatus的话
// 无法调用displayStatus,也就无法发挥多态和动态绑定的威力
}
public static void main(String[] args) {
System.out.println("***测试中国空调***");
test(new ChineseAirConditioner());
System.out.println("***测试美国空调***");
test(new AmericanAirConditioner());
}
}
即可产生最后输出:
***测试中国空调***
空调状态: 开启
空调状态: 关闭
***测试美国空调***
Air Conditioner Status: ON
Air Conditioner Status: OFF
3.2总结
抽象类是Java中实现代码复用的强大工具。通过在父类中定义抽象方法和具体实现,我们可以在不增加代码冗余的情况下,使代码更加灵活和可维护。掌握抽象类的使用方法和特性,是编写高效和可扩展Java代码的关键。