你的位置:首页 > Java教程

[Java教程]《Java4Android》视频学习笔记——为什么用抽象类?


我们来举个例子,然后引出这个问题的答案:

 

市面上有 喷墨式打印机 和 针式打印机 这两种形式的打印机,我们需要编程来实现他们的 开机,关机以及打印。

构建父类Printer

class Printer
{
void open(){
System.out.println("OPEN");
}


void close(){
System.out.println("CLOSE");
}

void print(){                                                                //由于两种打印机的打印方式不同,所以无法在父类里面写出具体打印方式,因此空着。
}
}

构建子类HPprinter

//该打印机为喷墨打印机
class HPprinter extends Printer
{
void print(){
System.out.println("喷墨打印");
}
}

构建子类Canonprinter

//该打印机为针式打印机
class Canonprinter extends Printer
{
void print(){
System.out.println("针式打印");
}
}

构建主函数 Test 实现功能

class Test
{
public static void main(String args[]){
Printer HP = new HPprinter();

HP.open();
HP.print();
HP.close();


Printer Canon = new Canonprinter();

Canon.open();
Canon.print();
Canon.close();


}
}

编译运行发现没有错误。

 

可是,计算机说没有错误就真的没有错误吗?不见得。设想一下,如果,写子类程序的人要是粗心,忘记了复写父类的 void print(){}; 会发生什么事情?

当然,编译时没有错误的,可是,打印机却没有了最重要的功能,并且,这种情况电脑是不会告诉你,哪儿有问题的。虽然这是个可能性很低的例子,但是大家不要纠结于此,且看老夫引蛇出洞:

既然问题出现了,那就有解决方法,这时,我们灵光乍现,忽然想起了亲爱的 抽象函数,它不就是干这个的吗?

重新定义父类 Printer

abstract class Printer
{
void open(){
System.out.println("OPEN");
}


void close(){
System.out.println("CLOSE");
}

abstract void print(){
}
}

现在当我们忘记复写 print(){}; 的时候,系统是编译不过去的,重新实现人机结合。同时,需要注意的一句话是:

如果一段代码在语意上是错误的,那它在语法上也应该是有错误的,比如说我们之前的 print(){}; ,它居然是空着的,那它就是在语意上说不过去,所以语法上也是有错误的,只不过编译器没有识破它。最后我们还是用抽象函数这个语法解决了问题。