0
点赞
收藏
分享

微信扫一扫

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. 内容不多,多多练习,进度跟上。


举报

相关推荐

0 条评论