Java4Android自学记录(18):为什么要使用抽象类

1 目录及资源索引

  Java4Android自学过程目录及资源索引

2 原因

  抽象类表达的是一种概念;

  抽象:顶层的,公共的,最不容易出错的。相当于大的框架结构,顶层设计等;

  举一个简单的例子,之前使用过的打印机,可能有很多种打印机,打印机的打印功能各有差异,父类如何定义打印函数?很简单,定义成抽象函数,然后子类继承的时候再去复写这个函数即可。如果子类继承后,没有复写父类的抽象函数,那么编译就会报错哒。(抽象:abstract)

3 打印机代码分析

  之前打印机的代码,打印机父类 Printer 代码如下:

class Printer
{
	void open()
	{
		System.out.println("Open");
	}
	
	void close()
	{
		System.out.println("Close");
	}
	
	void print(String s)
	{
		System.out.println("print-->" + s);
	}
}

  HP打印机代码如下:

class HPPrinter extends Printer
{

}

  Canon打印机代码如下:

class CanonPrinter extends Printer
{
	void close()
	{
		this.clean();		// 先调用本类的clean方法
		super.close();		// 在调用父类的close方法
	}
	
	void clean()
	{
		System.out.println("clean");
	}
}

  存放主函数的类 Test 中,代码如下:

class Test
{
	public static void main(String args[])
	{
		int flag = 1;
		
		if(0 == flag)		// 使用 HP 打印机
		{
			HPPrinter hpPrinter=  new HPPrinter();
			
			hpPrinter.open();
			hpPrinter.print("zhangsan");
			hpPrinter.close();			
		}
		else if(1 == flag)	// 使用 canon 打印机
		{
			CanonPrinter canonPrinter = new CanonPrinter();
			
			canonPrinter.open();
			canonPrinter.print("lisi");
			canonPrinter.close();	
		}
	}
}

  上边程序看起来运行的很完美,但是里边存在一个巨大的隐患,假如子类忘了复写与父类同名的函数,怎么办?此时编译或运行都不会报错,但是父类的函数体为空,不复写会直接调用父类的同名函数,执行起来会怎样?

  但是如果把父类的定义为抽象函数,则如果子类没有复写,编译就会出错。因为父类是一个抽象函数,不复写会报错哦。

  这样做的好处是:如果把父类定义为抽象类,子类实现的函数定义为抽象函数,子类在调用的时候,就必须要复写,不然会报错。

  老师:“如果一段代码在语义上是有错误的,那么在语法上也应该是有错误的。但是现在没有哪一门语言可以这样。语法错误比语义错误更容易检查出来。”

4 总结

  1. 明白了使用抽象类、抽象函数的好处;
  2. 如果某个类或某个函数,我们无法确定其函数怎么实现,就可以写成抽象类/抽象函数,这样在子类继承时,万一忘记复写了,编译器也会提示我们的;
  3. 内容不多,多多练习,进度跟上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FightingBoom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值