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

时间: 2024-12-18 05:30:06

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

韩顺平视频学习笔记-简易qq

1 package myclient; 2 3 import java.net.*; 4 import java.util.Date; 5 import java.text.SimpleDateFormat; 6 import java.awt.event.ActionEvent; 7 import java.awt.event.ActionListener; 8 import java.io.*; 9 import java.awt.*; 10 11 import javax.swing.*;

Spring视频学习笔记(二)

Spring视频学习笔记(二) XML配置里的Bean自动装配(三个来测试实现) /** * Person类 * */ public class Person { private String name; private Address address; private Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public Ad

老男孩视频第二部视频学习笔记(第二部)之一:命令(1)

命令:chkconfig  cat ls tail ln find wc tar cut grep egrep 一.如何过滤出已知当前目录下的所有一级目录 如何区分目录和文件:   1.利用颜色(这个依赖与CRT等工具)   2.利用 开头字母 · ls –l | grep ^d (正则表达式中一个字符 在[]中是非,在[]外面就是以什么开头) · ls –lF | grep / · ls –lF | grep /$  小结: 1.通过ls –l 以长格式显示文件属性,然后过滤以d开关的行,就是

马哥教育视频学习笔记-shell脚本完成磁盘分区格式化

马哥教育视频学习笔记-shell脚本完成磁盘分区格式化-http://edu.51cto.com/lesson/id-28201.html 以下是脚本内容,内容比较简单,不做详解 在Linux上准备一块空闲的磁盘即可,如何分区可以在脚本内改下 #!/bin/bash # echo "Initial a disk..." echo -e "\033[31mWarning: \033[0m " #开始的说明信息,其中Warning以红色字体显示 fdisk -l 2&g

私房库视频学习笔记-小清新BBS系统开发技术归纳

自己一直在学习PHP开发,前一段时间在51cto上看到私房库孙胜利老师的视频,下载了他的小清新BBS系统开发视频学习.现在把里面的好的运用收集到这儿. 在看了这套视频后先了解整个web项目开发的过程. 公共配置参数: <?php date_default_timezone_set('Asia/Shanghai');//设置时区session_start();header('Content-type:text/html;charset=utf-8');if(version_compare(PHP_

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

抽象函数的语法特征 1.类是抽象的,对象是具体的.面向对象里面有个非常重要的特征:先抽象,后具体. 2.只有函数的定义,而没有函数体的函数叫做抽象函数. abstract void fun(); ( 函数的定义:返回值类型,函数名,参数列表组成函数的定义.) 3.语法:如果一个类当中拥有一个或者一个以上的函数是抽象函数,那这个类也必须被声明为抽象类. class Person {Person(){System.out.println("Person的构造函数");}String nam

毕向东Java视频学习笔记【Day09 继承+接口+抽象类】

Java_Day09 继承+接口+抽象类 构造函数 子父类中的构造函数特点. 在子类构造对象时,发现访问子类构造函数时,父类也运行了. 为什么呢? 因为:在子类的构造函数中第一行有一个默认的隐式语句 super() 子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参构造函数. 在每个子类构造函数中,都有一个隐式的super()调用父类空参构造函数. 如果想输出22行内容,必须在29行改为super(5),这样可以访问到父类带参数的构造函数. 为什么子类实例化的时候会访问到父类的构造函

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

怎么打包?代码如下 package org.marsdroid; class Test{ public static void main(String args[]){ System.out.println("Hello package"); }} 关于打包,需要注意这几点: 1.打包后的类,编译方法不同了.它需要使用 -d 参数,这个参数的作用是依照包名生成相应的文件夹.并且 -d 后面跟的是目录,“.”代表当前目录.比如编译以上类,则应该为 javac -d . Test.java

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

---恢复内容开始--- 有一台HP打印机需要一个程序来实现开机,打印,关机这三个功能 class HPprinter { void open(){ System.out.println("Open"); } void print(String s){ System.out.println("print-->" + s); } void close(){ System.out.println("Close"); } } class Test