热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

面向对象编程(七)接口,面向接口编程积_跬步

接口接口语法:interface接口名{静态常量、抽象方法}接口的特点:①接口中只能存放静态常量和抽象方法;②Java接口是对功能的扩展;③通过实现接口
面向对象编程(七)接口,面向接口编程

接口

接口语法

interface 接口名{

           //静态常量、抽象方法

}

 

接口的特点

①   接口中只能存放静态常量和抽象方法;

②   Java接口是对功能的扩展;

③   通过实现接口,java类可以实现多实现;

④   一个人可以同时继承(extends)一个父类并且实现(implements)多个接口;

⑤   接口与接口之间可以通过使用extends来产生继承关系;

 

接口与抽象类的区别

①   抽象类和具体实现类之间是一种继承关系,也就是说如果采用抽象类的方式,则父类和子类在概念上应该是相同的;

②   接口和实现类在概念上不要求相同,接口只是抽取互相之间没有关系的类的共同特征,而不去关注类之间的关系,它可以使没有层次关系的类具有相同的行为;

③   抽象类是对一组具有相同属性和行为的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和行为的逻辑上不相关的事物的一种抽象;

④   对于接口和抽象类的选择,反映出设计人员看待问题的不同角度。抽象类用于一组相关的事物,表示的事“is-a”的关系;而接口用于一组不相关的事物,表示的是“like-a”的关系;

不使用接口code

 1 public class InterfaceDemo{
 2     public static void main(String []args){
 3         Person p=new Person();
 4         Child child=new Child();
 5         Dog dog=new Dog();
 6         p.feed(child);
 7         p.feed(dog);
 8     }
 9 }
10 
11 class Person{
12     public void feed(Child child){
13         child.eat();
14     }
15     public void feed(Dog dog){
16         dog.eat();
17     }
18     
19 }
20 
21 interface IAbility{
22     //接口中只能放共有的静态常量和抽象方法
23     //接口中会默认public static final
24     /*public static final*/ /*int number=1;*/
25     
26     //方法中会默认加上public abstract
27     /*public abstract*/ /*void show();*/
28 }
29 
30 class Child{
31     public void eat(){
32         System.out.println("吃米饭");
33     }
34 }
35 
36 class Dog{
37     public void eat(){
38         System.out.println("啃骨头");
39     }
40 }

使用接口code

 1 public class InterfaceDemo{
 2     public static void main(String []args){
 3         Person p=new Person();
 4         Child child=new Child();
 5         Dog dog=new Dog();
 6         p.feed(child);
 7         p.feed(dog);
 8     }
 9 }
10 
11 class Person{
12     /*public void feed(Child child){
13         child.eat();
14     }
15     public void feed(Dog dog){
16         dog.eat();
17     }*/
18     //接口的引用变量可以引用其实现类的对象
19     //接口实现了多态
20     public void feed(IAbility ability){
21         ability.eat();//动态绑定
22     }
23     
24 }
25 
26 interface IAbility{
27     //接口中只能放共有的静态常量和抽象方法
28     //接口中会默认public static final
29     /*public static final*/ /*int number=1;*/
30     
31     //方法中会默认加上public abstract
32     /*public abstract*/ /*void show();*/
33     
34     void eat();
35 }
36 
37 class Child implements IAbility{
38     public void eat(){
39         System.out.println("吃米饭");
40     }
41 }
42 
43 class Dog implements IAbility{
44     public void eat(){
45         System.out.println("啃骨头");
46     }
47 }

 

面向接口编程

开发系统时,主体架构使用接口,接口构成系统的骨架;

这样就可以通过更换接口的实现类更换系统的实现;

 

示例:

需求:学习内部安装了彩色打印机或黑白打印机,通过其所安装的打印机可以用来打印教员的详细信息,也可以打印学校其自身的详细信息;

改写以前编写过的一个程序(打印机打印的程序)

 1 public class PrinterDemo{
 2     public static void main(String []args){
 3         ColorPrinter cp=new ColorPrinter("惠普");
 4         BlackPrinter bp=new BlackPrinter("戴尔");
 5         ZhenPrinter zp=new ZhenPrinter("戴尔");
 6         School school=new School();
 7         
 8         school.setPrinter(zp);//这里的参数可以调用较灵活,使用cp,bp,zp都可以,而不用改school类中的方法
 9         
10         Teacher t=new Teacher("张三",30);
11         school.print(t);
12         school.print(school); 
13     }
14 }
15 
16 interface IInfo{
17     String detail();
18 }
19 
20 abstract class Printer{
21     private String brand;
22     
23     public Printer(String brand){
24         this.brand=brand;
25     }
26     
27     public String getBrand()
28     {
29         return brand;
30     }
31     
32     //打印方法应该由其子类来具体的实现
33     public abstract void print(String content);
34 }
35 
36 //开原原则:对修改是封闭的,对扩展是开放的,不要违反开闭原则
37 //可以使用多态解决这个问题,父类的引用变量可以引用其子类的对象
38 class School implements IInfo{
39     private Printer p=null;//安装打印机
40     
41     //拿父类的引用变量作为参数,好处就是可以接受任何其子类的对象
42     //越是抽象的东西就是越稳定的
43     public void setPrinter(Printer p){
44         this.p=p;
45     }
46     //多态,程序设计时主体框架使用接口或抽象类,是程序具有很好的维护性和扩展性
47     public void print(IInfo info){
48         //交给中心所安装的打印机来打印
49         p.print(info.detail());
50     }
51     
52     public String detail(){
53         return "hello,我是学校";
54     }
55 }
56 
57 class ColorPrinter extends Printer{
58     public ColorPrinter(String brand){
59         super(brand);
60     }
61     //对父类的方法进行重写
62     public void print(String content){
63         System.out.println(getBrand()+"彩色打印:"+content);
64     }
65 }
66 
67 class BlackPrinter extends Printer{
68     public BlackPrinter(String brand){
69         super(brand);
70     }
71     //对父类的方法进行重写
72     public void print(String content){
73         System.out.println(getBrand()+"黑白打印:"+content);
74     }
75 }
76 
77 class ZhenPrinter extends Printer{
78     public ZhenPrinter(String brand){
79         super(brand);
80     }
81     //对父类的方法进行重写
82     public void print(String content){
83         System.out.println(getBrand()+"针式打印:"+content);
84     }
85 }
86 
87 class Teacher implements IInfo{
88     private String name;
89     private int age;
90     public Teacher(String name,int age){
91         this.name=name;
92         this.age=age;
93     }
94     public String detail(){
95         return "我的名字叫:"+name+",今年:"+age+"岁";
96     }
97 }

 

posted on 2016-03-20 20:06  积_跬步  阅读(1605)  评论(0)  编辑  收藏  举报

推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
author-avatar
博瑞装饰王龙骏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有