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的更多相关文章

  1. Java接口interface

    Java接口interface 1.多个无关的类可以实现同一个接口. 2.一个类可以实现多个无关的接口. 3.与继承关系类似,接口与实现类之间存在多态性. 接口(interface)是抽象方法和常量值 ...

  2. 浅谈Java接口(Interface)

    浅谈Java接口 先不谈接口,不妨设想一个问题? 如果你写了个Animal类,有许多类继承了他,包括Hippo(河马), Dog, Wolf, Cat, Tiger这几个类.你把这几个类拿给别人用,但 ...

  3. Java 接口 interface implements

    接口定义了一系列的抽象方法和常量,形成一个属性集合. 接口定义完成后任何类都可以实现接口,而且一个类可以实现多个接口. 实现接口的类必须实现接口中定义的抽象方法,具体实现细节由类自己定义.可以说接口定 ...

  4. 详解java接口interface

    引言 接口这个词在生活中我们并不陌生. 在中国大陆,我们可以将自己的家用电器的插头插到符合它插口的插座上: 我们在戴尔,惠普,联想,苹果等品牌电脑之间传输数据时,可以使用U盘进行传输. 插座的普适性是 ...

  5. Java接口interface,匿名内部类

    接口 1.接口内部为 常量+公用的抽象方法.类必须实现接口中的所有方法 2.接口的语法格式:不写abstract会自动添加,可以继承多个接口 修饰符不能使private,protected [修饰符] ...

  6. java接口(interface)

    引入:抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特殊的“抽象类”→ 接口; 例子: 生活中听说过的USB接口其实并不是我们所看到的那些插槽,而是那些插槽所遵循的一种规范 ...

  7. Java 接口和抽象类差别

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想非常大程度上取决于它的总体架构,而这个总体架构事实上 ...

  8. Java 接口和抽象类区别(写的很好,转了)

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...

  9. Java 接口和抽象类--缺省模式

    一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...

随机推荐

  1. Struts 2中的constant详解【转载】

    通过对这些属性的配置,可以改变Struts 2 框架的一些默认行为,这些配置可以在struts.xml文件中完成,也可以在struts.properties文件中完成. struts.xml 1.&l ...

  2. MOSFET学习

    MOS/CMOS集成电路简介及N沟道MOS管和P沟道MOS管 在实际项目中,我们基本都用增强型mos管,分为N沟道和P沟道两种. 我们常用的是NMOS,因为其导通电阻小,且容易制造.在MOS管原理图上 ...

  3. 集训队8月1日(拓扑排序+DFS+主席树入门)

    上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/246 ...

  4. [NOIP模拟测试34]反思+题解

    不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...

  5. javascript全量匹配屏蔽词

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. flex 布局 实现三点筛子

    实现麻将中三点筛子:效果如下图 具体实现代码: html代码: <div class="box"> <div class="item"> ...

  7. 屏蔽浏览器默认样式 user agent stylesheet

    user agent stylesheet <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  8. freemark 语法

    我们通过后端model. addAttribute() 传递到前端的值来进行界面渲染 它的循环语句 和其他的有点不同: if 循环 <#if 条件语句> </#if> if  ...

  9. Openstack组件部署 — 将一个自定义 Service 添加到 Keystone

    目录 目录 Keystone 认证流程 让 Keystone 为一个新的项目 Service 提供验证功能 最后 Keystone 认证流程 User 使用凭证(username/password) ...

  10. Git与GitHub同步

    如何通过Git Bash实现本地与远端仓库——GitHub的同步 1.下载安装Git:下载网址 2.在自己的github上新建一个repository 例如我这里新建了一个叫test的reposito ...