1 目录及资源索引
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 总结
- 明白了使用抽象类、抽象函数的好处;
- 如果某个类或某个函数,我们无法确定其函数怎么实现,就可以写成抽象类/抽象函数,这样在子类继承时,万一忘记复写了,编译器也会提示我们的;
- 内容不多,多多练习,进度跟上。