流程
某日,在办公室中...客户A:我需要写一个控制打印机的程序,我的办公室现在有一台HP打印机~能开机,关机,打印就行了程序猿B:没问题!~(so easy)
1.HP打印机类class HPprinter{ void open(){ System.out.println("Open"); } void close(){ System.out.println("Close"); } void printer(){ System.out.println("Printer..."); } }
2.执行功能类
public class Test{ public static void main(String[] args){ //执行打印机程序 HPprinter client=new HPprinter(); client.open(); client.printer(); client.close(); } }
执行结果:
次日,在办公室中...客户A:我办公室又买了一台Canon打印机,关机前还带清洁功能呢~帮我再写个程序吧,应该很容易吧?程序猿B:好吧!~(客户就是上帝...xxxx)
1.HP打印机类
public class Test{ public static void main(String[] args){ //执行打印机程序 HPprinter client=new HPprinter(); client.open(); client.printer(); client.close(); } }
2.Canon打印机类3.执行过程class CanonPrinter{ void open(){ System.out.println("Open...你好 色彩~"); } void close(){ clean(); System.out.println("Close.. 佳能 感动常在~"); } void printer(){ System.out.println("Canon--> Print...."); } void clean(){ System.out.println("正在清洁..."); } }
4.结果:public class Test{ public static void main(String[] args){ //选择用哪个打印机 int flag=1; //执行打印机程序 if(flag==0){ HPprinter client=new HPprinter(); client.open(); client.printer(); client.close(); } else if (flag==1){ CanonPrinter one=new CanonPrinter(); one.open(); one.printer(); one.close(); } } }
次次次日,在办公室中...客户A:我办公室又买了一台xxxx打印机,还带xxxx功能呢~帮我再写个程序吧,应该很容易吧?程序猿B:你大爷的~
问题
是不是没多一台就要多写一次几个功能方法?是不是代码重复了?怎么解决?-------面向对象的继承
1.修改后的打印机父类//打印机父类 class Printer{ void open(){ System.out.println("Open.."); } void close(){ System.out.println("Close.."); } void print(){ System.out.println("Print-->"); } }
2.HP//HP打印功能 class HP extends Printer{ //基本功能已经可以从父类继承,需要扩展可以通过复写,增加方法都可以 }
3.Canon类
//Canon打印机 class Canon extends Printer{ //Canon特色,复写几个功能 void open(){ System.out.println("Canon 你好色彩"); super.open(); } //扩展关机功能 void close(){ this.clean(); System.out.println("Canon 感动感动常在"); super.close(); } void clean(){ System.out.println("clean..."); } }
4.Test
public class Test{ public static void main(String[] args){ //调用打印机 int flag=1; switch(flag){ case 0:{ HP one=new HP(); one.open(); one.print(); one.close(); break; } case 1:{ Canon sec=new Canon(); sec.open(); sec.print(); sec.close(); break; } default:{ System.out.println("选择错误"); break; } } } }
5.结果:
次次次次次日,在办公室中...客户A:我办公室又买了一台xxxx打印机,还带xxxx功能呢~帮我再写个程序吧,应该很容易吧?程序猿B:我把全世界的打印机的程序都写了把~
上一次隐患
在上次编写的打印机代码中,直接在父类定义了打印方法的实现,严格上来说存在了一下问题(1).两种打印机的Print()方法实现在真是情况下是不同的。(2).上次利用的是现在父类写实现,子类通过复写打印方法,能不能直接留空方法体呢?(3).在父类print(){//留空}中,是否存在什么安全隐患呢?
流程
//打印机父类 class Printer{ void open(){ System.out.println("Open..."); } void close(){ System.out.println("Close..."); } //实现留空的打印方法 void print(){ } }
//Canon打印机 class Canon extends Printer{ //复写print方法 void print(){ System.out.println("Canon 喷墨打印机 "); } }
//HP打印机 class HP extends Printer{ //改写print方法 void print(){ System.out.println("HP 激光打印机"); } }
//测试方法 public class Test{ public static void main(String args[]){ //测试打印机 HP one=new HP(); one.open(); one.print(); one.close(); Canon sec=new Canon(); sec.open(); sec.print(); sec.close(); } }
//输出
/* yg@yg-Ubuntu:~/Desktop/code$ javac *.java yg@yg-Ubuntu:~/Desktop/code$ java Test Open... HP 激光打印机 Close... Open... Canon 喷墨打印机 Close...*/
问题:子类忘记复写方法会怎么样?
yg@yg-Ubuntu:~/Desktop/code$ javac *.java yg@yg-Ubuntu:~/Desktop/code$ java Test Open... Close... Open... Canon 喷墨打印机 Close...
(1).如上在编译时候无问题,说明语法上不存在错误,但是HP打印功能上少了!
用抽象类改写父类
(1).用抽象类后,继承者必须完成抽象函数的实现,不然编译则无法通过,这样也将错误停留在编译阶段。
//抽象类改写父类 abstract class Printer{ void open(){ System.out.println("Open..."); } void close(){ System.out.println("Close..."); } //抽象方法 abstract void print(); }
编译运行:
HP.java:2: error: HP is not abstract and does not override abstract method print() in Printer class HP extends Printer{ ^ 1 error//再用抽象类后,继承者必须完成抽象函数的实现,不然编译则无法通过,这样也将错误停留在
作者:YangGan
出处:http://blog.csdn.net/incyanggan
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名Yanggan(包含链接).