• 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("=====被代理类执行完毕======");

           }

    }

  • 相关阅读:
    angular中scope的watch用法
    angular中对于no-repeat的优化——track by
    angular筛选器
    为什么我只贴代码不给你们源码?
    新添子节点却无法被之前的删除功能所删除,处理方法,给删除功能延迟,有好办法记得告诉我下哈,感激不进
    IDEA下Maven项目搭建踩坑记----3.最长的bug,最简单的错误。同一类中,部分函数的@AutoWired注入的对象失效
    IDEA下Maven项目搭建踩坑记----2.项目编译之后 在service层运行时找不到 com.dao.CarDao
    IDEA下Maven项目搭建踩坑记----1.pom,xml文件下${spring-version}不能用
    Myeclipse maven 配置有问题 改之后重启还是不好用
    前端 的一些css的写法
  • 原文地址:https://www.cnblogs.com/superjishere/p/11829645.html
Copyright © 2020-2023  润新知