Java——接口interface
3.5接口interface
①有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
②接口(interface)是抽象方法和常量值的定义的集合。
③从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。


3.5.1接口基础语法:
接口也是一种引用类型,可以等同看做类.
①如何定义接口,语法:
[修饰符] interface 接口名{}
②接口中只能出现:常量、抽象方法。
接口中的所有成员变量都默认是由public static final修饰的。
接口中的所有方法都默认是由public abstract修饰的。
③接口其实是一个特殊的抽象类,特殊在接口是完全抽象的。
④接口中没有构造方法,无法被实例化。
⑤接口和接口之间可以多继承。
⑥一个类可以实现多个接口。(这里的“实现”可以等同看做“继承”)
⑦一个非抽象的类实现接口,需要将接口中所有的方法“实现/重写/覆盖”,方可实例化。否则,仍为抽象类。
⑧如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类
⑨接口的主要用途就是被实现类实现。(面向接口编程)
与继承关系类似,接口与实现类之间存在多态性。
定义Java类的语法格式:先写extends,后写implements
|
public interface A{ //常量(必须用public static final修饰) public static final String SUCCESS = "success"; public static final double PI = 3.14; byte MAX_VALUE = 127; //常量//public static final是可以省略的。 //抽象方法(接口中所有的抽象方法都是public abstract) public abstract void m1(); void m2();//public abstract是可以省略的。 } interface B{ void m1(); } interface C{ void m2(); } interface D{ void m3(); } interface E extends B,C,D{ void m4(); } //implements是实现的意思,是一个关键字. //implements和extends意义相同。 class MyClass implements B,C{ public void m1(){} public void m2(){} } class F implements E{ public void m1(){} public void m2(){} public void m3(){} public void m4(){} } |

3.5.2接口的作用
①可以使项目分层,所有层都面向接口开发,开发效率提高了。
②接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”。可以随意切换。
③接口和抽象类都能完成某个功能,优先选择接口。因为接口可以多实现,多继承。并且一个类除了实现接口之外,还可以去继承其他类(保留了类的继承)。
举例1:
|
public interface CustomerService{ //定义一个退出系统的方法 void logout(); } |
|
/* 编写接口的实现类. 该类的编写完全是面向接口去实现的。 */ public class CustomerServiceImpl implements CustomerService{ //对接口中的抽象方法进行实现。 public void logout(){ System.out.println("成功退出系统!"); } } |
|
public class Test{ //入口 public static void main(String[] args){ //要执行CustomerServiceImpl中的logout方法. //以下程序面向接口去调用 CustomerService cs = new CustomerServiceImpl(); //多态 //调用 cs.logout(); } } |

举例2:
|
/* 汽车和发动机之间的接口。 生产汽车的厂家面向接口生产。 生产发动机的厂家面向接口生产。 */ public interface Engine{ //所有的发动机都可以启动. void start(); } |
|
//生产汽车 public class Car{ //Field //引擎 //面向接口编程 Engine e; //Constructor Car(Engine e){ this.e = e; } //汽车应该能够测试引擎 public void testEngine(){ e.start();//面向接口调用 } } |
|
public class YAMAHA implements Engine{ public void start(){ System.out.println("YAMAHA启动"); } } |
|
public class HONDA implements Engine{ public void start(){ System.out.println("HONDA启动"); } } |
|
public class Test{ public static void main(String[] args){ //1.生产引擎 YAMAHA e1 = new YAMAHA(); //2.生产汽车 Car c = new Car(e1); //3.测试引擎 c.testEngine(); //换HONDA c.e = new HONDA(); c.testEngine(); } } |
3.5.3接口的应用:工厂方法(FactoryMethod)& 代理模式(Proxy)
①工厂方法(FactoryMethod)
概述:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
适用性:
1)当一个类不知道它所必须创建的对象的类的时候
2)当一个类希望由它的子类来指定它所创建的对象的时候
3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
工厂方法举例:

总结:
FactoryMethod模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。FactoryMethod解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。
//接口的应用:工厂方法的设计模式
|
public class TestFactoryMethod { public static void main(String[] args) { IWorkFactory i = new StudentWorkFactory(); i.getWork().doWork(); IWorkFactory i1 = new TeacherWorkFactory(); i1.getWork().doWork(); } } interface IWorkFactory{ Work getWork(); } |
|
class StudentWorkFactory implements IWorkFactory{ @Override public Work getWork() { return new StudentWork(); } } class TeacherWorkFactory implements IWorkFactory{ @Override public Work getWork() { return new TeacherWork(); } } interface Work{ void doWork(); } class StudentWork implements Work{ @Override public void doWork() { System.out.println("学生写作业"); } } class TeacherWork implements Work{ @Override public void doWork() { System.out.println("老师批改作业"); } } |
②代理模式(Proxy)
概述:
为其他对象提供一种代理以控制对这个对象的访问。

|
interface Object{ void action(); } class ProxyObject implements Object{ Object obj; public void action(){ System.out.println("代理开始"); obj.action(); System.out.println("代理结束"); } public ProxyObject(){ System.out.println("这是代理类"); obj = new ObjectImpl(); } } class ObjectImpl implements Object{ public void action(){ System.out.println("======"); System.out.println("======"); System.out.println("被代理的类"); System.out.println("======"); System.out.println("======"); } } public class Test2 { public static void main(String[] args) { Object ob = new ProxyObject(); ob.action(); } } |
//接口的应用:代理模式(静态代理)
|
public class TestProxy { public static void main(String[] args) { Object obj = new ProxyObject(); obj.action(); } } interface Object{ void action(); } //代理类 class ProxyObject implements Object{ Object obj; public ProxyObject(){ System.out.println("代理类创建成功"); obj = new ObjctImpl(); } public void action(){ System.out.println("代理类开始执行"); obj.action(); System.out.println("代理类执行结束"); } } //被代理类 class ObjctImpl implements Object{ @Override public void action() { System.out.println("=====被代理类开始执行======"); System.out.println("=====具体的操作======"); System.out.println("=====被代理类执行完毕======"); } } |
Java——接口interface的更多相关文章
- Java接口interface
Java接口interface 1.多个无关的类可以实现同一个接口. 2.一个类可以实现多个无关的接口. 3.与继承关系类似,接口与实现类之间存在多态性. 接口(interface)是抽象方法和常量值 ...
- 浅谈Java接口(Interface)
浅谈Java接口 先不谈接口,不妨设想一个问题? 如果你写了个Animal类,有许多类继承了他,包括Hippo(河马), Dog, Wolf, Cat, Tiger这几个类.你把这几个类拿给别人用,但 ...
- Java 接口 interface implements
接口定义了一系列的抽象方法和常量,形成一个属性集合. 接口定义完成后任何类都可以实现接口,而且一个类可以实现多个接口. 实现接口的类必须实现接口中定义的抽象方法,具体实现细节由类自己定义.可以说接口定 ...
- 详解java接口interface
引言 接口这个词在生活中我们并不陌生. 在中国大陆,我们可以将自己的家用电器的插头插到符合它插口的插座上: 我们在戴尔,惠普,联想,苹果等品牌电脑之间传输数据时,可以使用U盘进行传输. 插座的普适性是 ...
- Java接口interface,匿名内部类
接口 1.接口内部为 常量+公用的抽象方法.类必须实现接口中的所有方法 2.接口的语法格式:不写abstract会自动添加,可以继承多个接口 修饰符不能使private,protected [修饰符] ...
- java接口(interface)
引入:抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特殊的“抽象类”→ 接口; 例子: 生活中听说过的USB接口其实并不是我们所看到的那些插槽,而是那些插槽所遵循的一种规范 ...
- Java 接口和抽象类差别
原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想非常大程度上取决于它的总体架构,而这个总体架构事实上 ...
- Java 接口和抽象类区别(写的很好,转了)
原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...
- Java 接口和抽象类--缺省模式
一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...
随机推荐
- Struts 2中的constant详解【转载】
通过对这些属性的配置,可以改变Struts 2 框架的一些默认行为,这些配置可以在struts.xml文件中完成,也可以在struts.properties文件中完成. struts.xml 1.&l ...
- MOSFET学习
MOS/CMOS集成电路简介及N沟道MOS管和P沟道MOS管 在实际项目中,我们基本都用增强型mos管,分为N沟道和P沟道两种. 我们常用的是NMOS,因为其导通电阻小,且容易制造.在MOS管原理图上 ...
- 集训队8月1日(拓扑排序+DFS+主席树入门)
上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/246 ...
- [NOIP模拟测试34]反思+题解
不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...
- javascript全量匹配屏蔽词
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- flex 布局 实现三点筛子
实现麻将中三点筛子:效果如下图 具体实现代码: html代码: <div class="box"> <div class="item"> ...
- 屏蔽浏览器默认样式 user agent stylesheet
user agent stylesheet <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- freemark 语法
我们通过后端model. addAttribute() 传递到前端的值来进行界面渲染 它的循环语句 和其他的有点不同: if 循环 <#if 条件语句> </#if> if ...
- Openstack组件部署 — 将一个自定义 Service 添加到 Keystone
目录 目录 Keystone 认证流程 让 Keystone 为一个新的项目 Service 提供验证功能 最后 Keystone 认证流程 User 使用凭证(username/password) ...
- Git与GitHub同步
如何通过Git Bash实现本地与远端仓库——GitHub的同步 1.下载安装Git:下载网址 2.在自己的github上新建一个repository 例如我这里新建了一个叫test的reposito ...