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 接口和抽象类--缺省模式
一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...
随机推荐
- 修改jquery默认的$
一.使用JQuery.noConflict() 该方法的作用就是让Jquery放弃对$的所有权,将$的控制权交还给prototype.js,因为jquery.js是后引入的,所以最后拥有$控制权的是j ...
- oracle创建用户ORA-01045:user lacks CREATE SESSION privilege;
conn internal/oracle grant user aaaa identified by aaaa; conn aaaa/aaaa 会报错: SQL>conn aaaa/aaaa 会 ...
- 【Flutter学习】页面布局之列表和表格处理
一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Padding.Center.Flex.Row.Colum.ListView.GridView.按照< ...
- 使用 nuxt+iview-admin+koa2 开发项目
公司最近在做的一个项目,依然是采用熟悉的vue开发,数据平台因为其数据量大的特点,采用传统的spa模式,首页加载时间很长,而SSR这种方式对于首屏的加载时间优化显而易见,同时还可以方便的进行SEO.因 ...
- 为什么NULL能多次free
void __cdecl _free_base (void * pBlock) { int retval = 0; if (pBlock == NULL) ...
- 监督局部线性嵌入算法(SLLE算法)
% SLLE ALGORITHM (using K nearest neighbors) % % [Y] = lle(X,K,dmax,a) % % X = data as D x N matrix ...
- Django框架(十八)—— auth框架:用户登录、注册、认证
目录 auth模块 一.什么是author模块 二.auth模块的使用 1.创建超级用户(create_superuser()) 2.验证用户(authenticate()) 3.登录用户(login ...
- 深入理解javascript原型和闭包(1)——一切都是对象 (转载)
深入理解javascript原型和闭包(1)——一切都是对象 http://www.cnblogs.com/wangfupeng1988/p/3977987.html “一切都是对象”这句话的重点在 ...
- 三、函数 (SUM、MIN、MAX、COUNT、AVG)
第八章 使用数据处理函数 8.1 函数 SQL支持利用函数来处理数据.函数一般是在数据上执行的,给数据的转换和处理提供了方便. 每一个DBMS都有特定的函数.只有少数几个函数被所有主要的DBMS等同的 ...
- 通用唯一标识码UUID的介绍及使用。
什么是UUID? UUID全称:Universally Unique Identifier,即通用唯一识别码. UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16^32 = ...