抽象类基本概念
类的继承,原有的类被称为基类或者是父类,而继承了父类的类被称为派生类或者子类,子类继承后拥有父类的全部成员还可以自己添加其它的功能。
在java中专门有一种类被当做父类,那就是“抽象类”,抽象类的使用规则如下:
- 有抽象方法的类必须是抽象类
- 抽象类不能被实例化对象只能被子类继承
- 抽象类中的全部抽象方法必须由子类来全部覆写
- 抽象类和抽象方法都必须使用 abstract 关键字声明
例子:
abstract class Printer {
public abstract void show(); //抽象方法,不用实现写方法体
}
class ColorsPrinter extends Printer{
public void show(){
System.out.println("打印彩色照片");
}
}
class BlackPrinter extends Printer{
public void show(){ //覆写抽象方法
System.out.println("打印黑白照片");
}
}
class Test1{
public static void main(String[] args) {
//Printer p = new Printer(); 实例化会编译报错
BlackPrinter blackPrinter = new BlackPrinter();
blackPrinter.show(); //打印黑白照片
}
}
抽象类的相关说明
注意这几点问题
- 抽象类不能用final修饰,因为被final修饰的类不能被子类继承
- 抽象类可以没有抽象方法,就算是没有抽象方法也不能实例化,必须由子类来继承
- 抽象类是普通类的加强版,只是加了一个抽象方法,抽象类里面也可以定义属性和方法,创建构造方法,子类实例化也会根据原则进行构造调用
abstract class Printer {
private String name;
public Printer(){}
public Printer(String name){
this.name = name;
}
public void getSystem(){
System.out.println(this.name);
}
}
class BlackPrinter extends Printer{
public BlackPrinter(String name){
super(name);
}
}
class Test1{
public static void main(String[] args) {
Printer blackPrinter = new BlackPrinter("小红");
blackPrinter.getSystem();
}
}
- 抽象类可以提供static方法,该方法不限制于对象,因为static方法是可以不通过对象调用的
abstract class Printer {
public static void get(){
System.out.println("static");
}
}
class Test1{
public static void main(String[] args) {
Printer.get(); //static
}
}
模板设计模式
在模板设计模式中,抽象类公开定义一个执行方法,而子类则去覆写抽象类中的抽象方法,最终是实现抽象类中的执行方法,这就是模板设计模式。
比如一个打印机模板,它的流程是,选择打印的文档、开始打印、打印完成,根据这个模板的逻辑,就可以实现彩色打印机和黑白打印机。
优点:
- 封装不变,扩展可变
- 由父类控制,由子类实现
- 提供公共代码,方便维护
缺点:
- 如果实现的子类过多,那么数据量将会很大
使用场景:有多个子类且逻辑相同的要实现
/**
* 打印机
* @author Administrator
*
*/
abstract class Printer {
public abstract void getSelect(); //选择打印文档
public abstract void getPrint(); //开始打印
public abstract void getAccomplish(); //打印完成
//行为实现
public final void show(){
getSelect();
getPrint();
getAccomplish();
}
}
//彩色打印机
class ColorsPrinter extends Printer{
@Override
public void getSelect() {
// TODO Auto-generated method stub
System.out.println("选择text1文档进行打印");
}
@Override
public void getPrint() {
// TODO Auto-generated method stub
System.out.println("打印彩色文档");
}
@Override
public void getAccomplish() {
// TODO Auto-generated method stub
System.out.println("彩色文档打印完成");
}
}
//黑白打印机
class BlackPrinter extends Printer{
@Override
public void getSelect() {
// TODO Auto-generated method stub
System.out.println("选择text2文档开始打印");
}
@Override
public void getPrint() {
// TODO Auto-generated method stub
System.out.println("打印黑白文档");
}
@Override
public void getAccomplish() {
// TODO Auto-generated method stub
System.out.println("黑白文档打印完成");
}
}
class Test1{
public static void main(String[] args) {
Printer bPrinter = new BlackPrinter();
bPrinter.show();
System.out.println();
Printer cPrinter = new ColorsPrinter();
cPrinter.show();
}
}
输出结果:
选择text2文档开始打印
打印黑白文档
黑白文档打印完成
选择text1文档进行打印
打印彩色文档
彩色文档打印完成
注意,模板执行方法设置为 final,这样它就不会被重写