抽象是个什么概念?
比如电脑就是一个抽象的概念,可以理解为一个抽象类。因为电脑可以分为笔记本电脑,台式机,掌上电脑等等。
使用抽象类可以防止出现一些错误:
假如忘了复写Hp打印机的print函数,编译不会报错,这时print就不会被调用,这就会导致功能型错误。
class Printer{
void open(){
System.out.println("Open");
}
void close(){
System.out.println("Close");
}
void print(){//没有定义为抽象函数
}
}
子类没有复写:
//该打印机为喷墨打印机
class HpPrinter extends Printer{
}
另一个子类:
//该打印机为针式打印机
class CannoPrinter extends Printer{
void print(){//复写
System.out.println("使用针式打印机进行打印");
}
void close(){
this.clean();
super.close();
}
void clean(){
System.out.println("clean");
}
}
class Test{
public static void main(String args[]){
Printer printer1 = new HpPrinter();
printer1.open();
printer1.print();
printer1.close();
Printer printer2 = new CannoPrinter();
printer2.open();
printer2.print();
printer2.close();
}
}
输出结果:
Open
Close
Open
使用针式打印机进行打印
clean
Close
可以发现,Hp打印机的print没有被调用到。
但是编译没有报错。。。
为了提到警示作用,这时抽象类的作用来了。将Printer定义为抽象类。如果没有复写print方法,编译其就会帮助提示报错。。
abstract class Printer{
void open(){
System.out.println("Open");
}
void close(){
System.out.println("Close");
}
/*
void print(){
}
*/
abstract void print();//定义为抽象函数
}
如果和上面一样没有实现复写,编译会错误:
HpPrinter.java:2: HpPrinter 不是抽象的,并且未覆盖 Printer 中的抽象方法 print()
class HpPrinter extends Printer{
^
1 错误
总结:
如果类中有个函数需要子类进行复写,那么这个函数写为抽象的是最好的。