原标题:Java 接口——面向对象的精髓

接口有何用?面试宝典上背下来的总结,你真的明白吗?接口&工厂方法其实很简单,什么是接口先看看生活中的接口,比如USB接口。

USB接口的设计者在最初就知道USB能支持这么多功能吗?他们是怎样未卜先知地设计的呢?其实他们也不知道以后USB上会连什么设备,他们只是定义了一个数据传输与供电的标准而已。

Java中也是类似的,定义了接口,就等于定义了调用对象的标准。接口的基本语法

使用interface定义;

接口当中的方法都是抽象方法;

接口当中的方法都是public权限(接口中的方法,写不写public修饰符,都是public权限,别的地方不行哦);

可以把接口理解成一个更加纯粹的抽象类,因此它也不能生成对象。这要怎么办呢?回想抽象类的处理方法,可以用一个类来继承(接口中叫实现)它,从而在子类中生成对象。

一个最简单的接口示例:

定义一个接口:

interfaceUSB{publicvoidread;publicvoidwrite;}

定义它的子类,来实现这个接口:

classPhoneimplementsUSB{publicvoidread{System.out.println("Phone-->Read");}publicvoidwrite{System.out.println("Phone-->Write");}}

测试:

classTest{publicstaticvoidmain(Stringargs){Phonephone=newPhone;//向上转型USBusb=phone;usb.read;usb.write;}}

运行结果:

图片描述

继续了解接口的语法:

实现接口使用implements关键字;

一个类可以实现多个接口;实现是特殊的继承,换句话说,就是一个类可以继承多个接口。修改上面的代码:再定义一个WiFi接口:

interfaceWiFi{publicvoidopen;publicvoidclose;}

让Phone也实现WiFi接口:

classPhoneimplementsUSB,WiFi{publicvoidread{System.out.println("Phone-->Reading");}publicvoidwrite{System.out.println("Phone-->Writing");}//实现WiFi中的抽象方法publicvoidopen{System.out.println("WiFi-->Open");}publicvoidclose{System.out.println("WiFi-->Close");}}

测试一下:

classTest{publicstaticvoidmain(Stringargs){Phonephone=newPhone;//向上转型时,就有两种选择USBusb=phone;usb.read;usb.write;WiFiwifi=phone;wifi.open;wifi.close;}}

运行结果:

图片描述

可以看到,用USB连接手机时,手机表现的就是USB的行为,用WiFi连接手机时,手机表现的就是WiFi的行为,这也是面向对象多态性非常明显的体现。

一个接口可以继承多个接口注意这里不能写成implements,因为我们只想继承USB和WiFi接口的抽象方法,而不想实现它。

interfaceSbFiextendsUSB,WiFi{publicvoidpiu;}

这样SbFi接口就拥有read,write,open,close和piu五个抽象方法了:)接口的实践如果我们接到一个客户的需求,用程序控制办公室中的打印机,我们该怎么做呢?容易想到,先用一个类描述“打印机”,再用一些方法实现“开机”、“关机”、“打印”等动作,一个简单的Printer类就能搞定了。可是如果客户提出了新的需求,办公室又买了一台其他品牌的打印机,让你修改之前的代码。这时要怎么做呢?都是打印机,只是品牌不同,功能略有差异,容易想到用接口或者继承。接口更灵活一些,所以我们写出了下面的代码:

首先定义一个Printer接口,描述打印机都有的行为:

interfacePrinter{voidopen;voidprint(Strings);voidclose;}

在惠普打印机类中,实现Printer中的抽象方法:

classHPPrinterimplementsPrinter{publicvoidopen{System.out.println("HP:open");}publicvoidprint(Strings){System.out.println("HP:print-->"+s);}publicvoidclose{System.out.println("HP:close");}}

在佳能打印机中,又增加了新的方法,清洗:

publicclassCanonPrinterimplementsPrinter{publicvoidopen{System.out.println("Canon:open");}publicvoidprint(Strings){System.out.println("Canon:print-->"+s);}publicvoidclose{this.clean;System.out.println("Canon:close");}publicvoidclean{System.out.println("Canon:clean");}}

测试:注意,这里使用对象的向上转型,能减少重复代码。不然就得用HPPrinter和CanonPrinter生成的对象分别调用open,print,close方法,很麻烦。如果以后有100台打印机,岂不是得写300行?

classTest{publicstaticvoidmain(Stringargs){Printerprinter=null;//为简便,flag模拟用户选择使用哪台打印机intflag=1;if(flag==0){//向上转型printer=newHPPrinter;}elseif(flag==1){printer=newCanonPrinter;}printer.open;printer.print("向上转型好用吧~");printer.close;}}

运行:

图片描述

大功告成。但是这样就足够了吗?如果我们的打印机代码,是在一个办公自动化的系统当中。可能有各种各样的功能,要使用打印机。那每次使用时,都要把Test类中的这一段写一遍吗?如果以后有100个地方要用,岂不是要把这一段写100次?更可怕的是,如果又添加了新的打印机,岂不是要修改这100段代码?太容易出错了。所以,我们和重复代码,是势不两立的(振臂一呼)!

进击的工厂方法模式减少重复代码的一般方法就是,把重复的代码放在一个地方(封装起来),等要用的时候,就调用它,而不是再写一遍。仔细看Test类,重复的地方,不包括最后三行,主要是根据用户的选择,生成打印机对象,并向上转型为Printer类型的部分。

我们可以设计一个类,在里面添加一个函数,它的功能就是根据用户的选择生成打印机对象,以后我们直接调用这个函数就行了。函数的参数,就是用户的选择,返回值,就是一个Printer类型的对象。

classPrinterFactory{//添加static是为了调用方便publicstaticPrintergetPrinter(intflag){Printerprinter=null;if(flag==0){printer=newHPPrinter;}elseif(flag==1){printer=newCanonPrinter;}returnprinter;}}classTest{publicstaticvoidmain(Stringargs){intflag=1;Printerprinter=PrinterFactory.getPrinter(flag);printer.open;printer.print("对象的转型好用吧~");printer.close;}}

这样,就算要增加100台打印机,也只用在PrinterFactory中添加elseif(flag==xxx)的代码,不用修改Test类。

这就是著名的简单静态工厂方法模式。PrinterFactory并不关心Printer类有多少个子类,这样我们就能够自由地修改Printer子类了。工厂方法模式的思路很简单,就是把生成对象的代码,封装在工厂类当中。返回搜狐,查看更多

责任编辑:

java wifi类_Java 接口——面向对象的精髓相关推荐

  1. 怎样用uml类图生成java类_JAVA:面向对象编程的底层逻辑,深度剖析

    什么是面向对象 在目前的软件开发领域有两种主流的开发方法,分别是结构化开发方法和面向对象开发方法.早期的编程语言如C.Basic.Pascal等都是结构化编程语言,随着软件开发技术的逐渐发展,人们发现 ...

  2. java电脑类的接口_java 一个类实现两个接口的案例

    直接用英文逗号分隔就可以了,比如:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 inerface IHello { String sayHello ...

  3. java的类和接口区别_Java接口和类的区别

    一.概述 定义 Comparable是在集合内部定义的方法实现的排序的接口,位于java.util下. Comparator是在集合外部实现的排序的接口,位于java.lang下. Comparabl ...

  4. java 实现类转接口_JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型

    2018-03-19 一.明确引用类型与对象类型的概念 引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是ADHero 引用也是 ...

  5. java基础-类-抽象类-接口(自学笔记)

    一.类 class 定义:具有相同属性(特性)和方法(行为)的一类事物 的抽象的总称 例如:人类,动物,车,屌丝类.是一种类别,世界上所有的事物都可以分类,在计算机中java都能进行对应和体现 类的三 ...

  6. java thread类_java多线程之Thread类

    Class Thread java.lang.Object java.lang.Thread 实现接口:Runnable 直接被继承的子类:ForkJoinWorkerThread public cl ...

  7. java 支付类的接口,Java后端支付大杂烩之core.dao,service,web(重点是接口的设计)(二)...

    PayMap PayMap是一个使用Java语言集成三方支付的小Demo,现已集成支付宝(国内.国际.移动端.PC端).微信.银联(ACP.UPOP).光大(网关.网页).邮政支付,采用的技术栈为:S ...

  8. java字典类_Java字典类

    java字典类 Java Dictionary is an abstract class. It was the parent class for any key-value mapping obje ...

  9. java匿名类_Java匿名类

    java匿名类 Java anonymous class are like local class or inner class without a name. We can use java ano ...

最新文章

  1. 这么设计,Redis 10亿数据量只需要100MB内存
  2. 从需求出发来看关系模型与非关系模型–关系模型与非关系模型概述
  3. MapReduce:Simplified Data Processing on Large Clusters中文版from百度文库
  4. jzoj100029. 【NOIP2017提高A组模拟7.8】陪审团(贪心,排序)
  5. 知乎招聘搜索算法实习生!邀你共建知乎搜索引擎!
  6. android底层oem,Android中如何实现OEM
  7. 天下会-百度搜索技巧语法大全
  8. 第四代双模5G旗舰:vivo X30系列为啥「超有梗」?
  9. html 滑动网格列表,网格列表
  10. 创建父需求子需求构建需求树_还不知道B+树 ?看完,别再问我什么是B+树 了
  11. python主要用来做什么-python主要用来做什么?Python开发简单吗?
  12. 【设计模式】java设计模式总述及观察者模式
  13. matlab定义域为全体实数画图,MATLAB数学手册教程_第7章_绘图与图形处理
  14. 全世界最全牛人的博客
  15. win10网信政府版安装.NET Framework3.5
  16. 指数函数 java_计算指数函数的算法
  17. mybatis采坑之 PageHelper.startPage出现两个limit情况
  18. 南京大学计算机系2019复试离散题目-逻辑与推理
  19. sqlite 查找表中多余的重复记录
  20. python头歌--文件翻转

热门文章

  1. MySQL 8.0中的JSON增强
  2. 资源放送丨《大规模 SQL 审核设计与实践》PPT视频
  3. 资源放送丨《 Kubernetes Operator 开发范式》PPT视频
  4. 2020,分布式架构会给传统数据库运维带来哪些变化?
  5. 一文搞懂MySQL-8.0 redo优化
  6. 墙裂推荐 | 漫画解读Elasticsearch原理,看完你就懂
  7. 也谈PostgreSQL的Vacuum机制及其最佳实践
  8. JS的深浅复制,原来如此!
  9. GaussDB(DWS)磁盘维护:vacuum full执行慢怎么办?
  10. 实践案例丨教你一键构建部署发布前端和Node.js服务