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

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

构建父类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(){}; ,它居然是空着的,那它就是在语意上说不过去,所以语法上也是有错误的,只不过编译器没有识破它。最后我们还是用抽象函数这个语法解决了问题。

《Java4Android》视频学习笔记——为什么用抽象类?的更多相关文章

  1. 《Java4Android》视频学习笔记——抽象类和抽象函数

    抽象函数的语法特征 1.类是抽象的,对象是具体的.面向对象里面有个非常重要的特征:先抽象,后具体. 2.只有函数的定义,而没有函数体的函数叫做抽象函数. abstract void fun(); ( ...

  2. 《Java4Android》视频学习笔记——包和访问权限(一)

    怎么打包?代码如下 package org.marsdroid; class Test{ public static void main(String args[]){ System.out.prin ...

  3. 《Java4android》视频学习笔记——面向对象的应用(一)

    ---恢复内容开始--- 有一台HP打印机需要一个程序来实现开机,打印,关机这三个功能 class HPprinter { void open(){ System.out.println(" ...

  4. 尚硅谷STRUTS2视频学习笔记

    上一个月一直在学习STRUTS2,学习的是尚硅谷佟刚老师的视频,因为很喜欢佟刚老师的声音,而且他讲的很细,笔记做的也多,基本上是照着他的视频完整的敲了一遍代码,下面就把学习到的知识梳理一遍,最后把项目 ...

  5. How to use the Custom Material node and create Metaballs 官方视频学习笔记

    这个视频Youtube没有字幕着实蛋疼,本人英语很渣,几乎听不懂,里面有很多文档没讲的重要信息(文档讲的东西太少了). 不过学习过后你可以解锁好几个姿势.这个视频主要是教你做DistanceField ...

  6. 传智播客C++视频学习笔记(3)

    #include<iostream> using namespace std; //内存分区模型 //代码区,存放二进制代码,由操作系统进行管理 //全局区,存放全局变量.静态变量.常量( ...

  7. 黑马程序员_Java基本数据的自动拆装箱及享元设计模式视频学习笔记

    ------- android培训.java培训.期待与您交流! ---------- 装箱:把基本数据类型装成java类(被托管?).         拆箱:把java类拆成基本数据类型(取消托管? ...

  8. VUE2.0 饿了吗视频学习笔记(四):颜色、跳转、设置、vue-resource

    https://gitee.com/1981633/vue_study.git 源码下载地址,随笔记动态更新中 1.设置选中项颜色 <template> <div id=" ...

  9. 【185天】黑马程序员27天视频学习笔记【Day14-下】

    叨逼叨两句 不容易,白天被叫去帮忙,不得已晚上来挑灯夜战,熬到2点,总算完成任务了. 我打算下周开始换一个更新时间,每次把deadline设置为晚上12点,都会接近或者超过这个时间,之后改成中午12点 ...

随机推荐

  1. iOS-数据解析XML解析的多种平台介绍

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...

  2. SpringSide 部署showcase项目出现 JAX-RS (REST Web Services) 2.0 can not be installed错误!

    maven+springmvc错误 JAX-RS (REST Web Services) 2.0 can not be installed 项目problem提示错误 JAX-RS (REST Web ...

  3. ios app 打包上传 app store(Application Loader)

    背景:使用Xcode 上传APP, 这个 有时候很慢,构建版本需要等很长时间,所以我推荐使用Application Loader 1.使用xocd 打包,导出.ipa文件 2. OK ,跟着上面做, ...

  4. ScheduleThreadPoolExecutor的工作原理与使用示例

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. ScheduleExecutorService接口.ScheduledFuture ...

  5. 你的 mixin 兼容 ECMAScript 5 吗

    原文:Are your mixins ECMAScript 5 compatible? 作者:Nicholas C. Zakas 我最近在与客户合作的项目中,需要充分利用的 ECMAScript 5, ...

  6. Ubuntu 14.04上安装caffe

    本来实在windows 10上尝试安装caffe,装了一天没装上,放弃; 改在windows上装ubuntu的双系统,装了一个下午,不小心windows的系统盘被锁死了,也不会unlock?只好含泪卸 ...

  7. ASP.NET MVC路由解析

    继续往下看<ASP.NET MVC5框架揭秘>. ASP.NET系统通过注册路由和现有的物理文件路径发生映射.而对于ASP.NET MVC来说,请求的是某个Controller中的具体的A ...

  8. Linux的IO性能监控

    一般使用iostat命令监控I/O性能1.iostat命令可用参数列表: OPTIONS -c Display the CPU utilization report. -d Display the d ...

  9. 利用Solr服务建立的站内搜索雏形---solr1

    最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下, ...

  10. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十】

    <Web 前端开发精华文章推荐>2013年第八期(总第二十期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...