十八.抽象类的定义与使用

抽象类基本概念

类的继承,原有的类被称为基类或者是父类,而继承了父类的类被称为派生类或者子类,子类继承后拥有父类的全部成员还可以自己添加其它的功能。

在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,这样它就不会被重写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值