抽象类是普通类与接口之间的一种中庸之道。尽管在构建具有某些为实现方法的类时,我们的第一想法可能是创建接口,但是抽象类仍然是用于此目的的一种重要而必须的工具。因为你不可能总是使用纯接口。
----java编程思想
抽象类概述
抽象类指的是使用abstract关键字修饰的类
抽象类特点
/**
* @description: 抽象类 书
* @author: candou
* @create: 2021-06-28 19:24
*/
public abstract class BookContent {
/**
* 抽象方法 对接不同三方保存书籍
*/
public abstract void saveBook();
/**
* 普通方法 书籍列表
*/
public void bookList() {
System.out.println("展示书籍列表");
}
}
1、抽象类和抽象方法必须使用 abstract关键字修饰
public abstract class 类名{} public abstract void 方法名();
2、抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
public abstract class ThirdPartyTwo extends BookContent {
}
如果一个抽象类中只有抽象方法,建议使用接口代替(接口是一个极度抽象的类)
3、抽象类不能实例化
抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,也叫抽象类多态
4、抽象类的子类
要么重写抽象类中的所有抽象方法,要么是抽象类
/**
* @description: 书籍来源对接实现
* @author: candou
* @create: 2021-06-29 00:35
*/
public class ThirdPartyOne extends BookContent {
@Override
public void saveBook() {
System.out.println("第一家书籍来源");
}
}
/**
* @description: 书籍来源对接
* @author: candou
* @create: 2021-06-29 00:36
*/
public abstract class ThirdPartyTwo extends BookContent {
}
5、抽象类和普通类不同的地方
1) 抽象类不能实例化,也就是不能使用new关键字创建对象,它的作用就是作为父类,被子类继承 2) 抽象类包含(不是必须)抽象方法,抽象方法必须定义在抽象类中
/**
* @description: 书籍相关测试
* @author: candou
* @create: 2021-06-29 00:46
*/
public class BookDemo {
public static void main(String[] args) {
BookContent bookContent = new BookContent() {
@Override
public void saveBook() {
System.out.println("书籍保存");
}
};
BookContent bookContent2 = new ThirdPartyOne();
bookContent.saveBook();
bookContent2.saveBook();
}
}
书籍保存
第一家书籍来源
抽象类的应用场景
1、明确类的抽象性
抽象类会告诉用户和编译器应该怎么去使用它们。例如在上述例子中,当有多个书籍来源的时候就很难做到这些书籍来源提供的格式是一样的,也就需要针对不同的来源编写不同的处理逻辑,从而转换成为我们数据库中所需要的格式进行存储。每当有一个新的来源需要对接时,在创建新的类之后只要继承了BookContent就会知道需要重写书籍的保存方法。
2、重构代码
抽象类可以使得我们很容易地将公共方法沿着继承关系进行抽取。
3、模板设计模式
上述例子中BookContent抽象类就是一个模板,他定义了书籍的两个方法,并将保存方法的具体实现延迟到了子类当做。也就使得其子类可以不改变整体结构就可以重新定义保存方法的实现逻辑。