【Java接口 12】

一、 接口(interface)

1、接口等同看作类,接口也是引用数据类型

2、接口是一个特殊的抽象类,特殊在接口是完全抽象的

3、接口不能被实例化,并且也没有构造方法

4、接口只能出现“常量”+“抽象方法”

5、接口和接口之间可以多继承,类和类之间只能单继承

6、一个类可以实现多个接口,(实现implements类似于继承extends)

7、一个非抽象的类实现接口,必须将接口中所有的抽象方法完全覆盖,实现。

8、接口中所有的数据都是public的,只有接口被实现的时候才能体现是public的

package com.JavaStudy.study0515;

/**
 * @Author wufq
 * @Date 2020/5/15 14:33
 */
public interface A
{
    //常量
    public static final double PI = 3.14;

    //程序中没有写final关键字时,系统会默认添加
    int BYTE_MAX_VALUE = 127;

    //抽象方法   --->接口中只能出现常量和抽象方法
    public abstract void m1();

    //同样抽象方法,不写abstract系统会默认添加
    void m2();

    //-->接口方法中不能有构造方法
    //void m3(){};

    //接口不能实例化,不能有构造方法
    //public A(){};

}

interface X{
    void m1();
}

interface Y{
    void m2();
}

interface Z{
    void m3();
}

//一个类可以实现多个接口,并且需要把接口里面的方法都实现
class k implements X,Y,Z{
    public void m1(){}; //抽象方法的实现,只需要加上实现体
    public void m2(){};
    public void m3(){};
}

//接口之间可以实现多继承
interface W extends X,Y,Z{
    void m4();
}

//e类实现W接口,而W接口又继承了X,Y,Z接口,所以需要实现X,Y,Z,W的所有方法
class e implements W{
    public void m1(){}; //抽象方法的实现,只需要加上实现体
    public void m2(){};
    public void m3(){};
    public void m4(){};
}

二、实例:

1、类继承接口实现接口的方法

2、运用多态调用接口内的方法

package com.JavaStudy.study0515;

public interface CustomeServices {
    //定义一个退出的方法
    void logOut();
}
package com.JavaStudy.study0515;

 public class CustomeServicesImpL implements CustomeServices {
    public void logOut(){
        System.out.println("退出成功!");
    }
}
package com.JavaStudy.study0515;

public class Test {

    public static void main(String[] args){
        CustomeServices c = new CustomeServicesImpL(); //父类的引用指向子类的对象,多态
        c.logOut();
    }
}

=====执行结果=====
退出成功!

三、接口应用

接口的作用:

1、有了接口以后,项目有了分层,项目可以分小组同时开发,项目的开发效率高

2、所有的程序都是面向接口编程的,没有面向具体,所以代码自然是解耦合的

项目的拓展能力增强,这种特性叫做“可插拔”特性

注意:分析接口的时候,必须分析清楚:实现方和调用方

菜单接口Menu (规范、标准、协议、合同)

接口实现方:Cooker

接口调用方:Customer

package com.JavaStudy.studyInterface0515;

/**
 * @Author wufq
 * @Date 2020/5/15 16:22
 */
public interface Menu {
    void hongshaorou();
    void oupian();
}
package com.JavaStudy.studyInterface0515;

/**
 * @Author wufq
 * 方法的实现方
 */
public class Cooker  implements Menu{
    public void hongshaorou(){
        System.out.println("张三喜欢红烧肉!");
    };
    public void oupian(){
        System.out.println("张三喜欢藕片!");
    };
}
package com.JavaStudy.studyInterface0515;

/**
 * @Author wufq
 * @Date 2020/5/15 16:31
 * 需求变更:接口需要另外类加以实现
 */
public class Cooker2 implements Menu{
    public void hongshaorou(){
        System.out.println("李四的红烧肉好了!");
    };
    public void oupian(){
        System.out.println("李四的藕片好了!");
    };
}
package com.JavaStudy.studyInterface0515;

/**
 * @Author wufq
 * @Date 2020/5/15 16:23
 * 方法的调用方
 */
public class Customer {
    //面向接口编程,避免面向具体编程(解耦合,增强扩展力)
    Menu m;

    Customer(Menu m){
        this.m = m;
    }

    public void diancan(){
        m.hongshaorou();
        m.oupian();
    }
}
package com.JavaStudy.studyInterface0515;

/**
 * @Author wufq
 * @Date 2020/5/15 16:23
 * 测试方法
 */
public class Test {
    public static void main(String[] args){
        //创建厨师
        Cooker cooker = new Cooker();
        //创建顾客
        Customer customer = new Customer(cooker);
        customer.diancan();

        Cooker2 cooker1 = new Cooker2();
        Customer customer1 = new Customer(cooker1);
        customer1.diancan();


    }
}

四、适配者模式

当想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,

在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法

具体的实现类只需要覆盖其需要完成的方法即可

package com.JavaStudy.studyInterface0515;

/**
 * @Author wufq
 * @Date 2020/5/15 17:30
 */
public interface Job {
    void speakChinese();
    void speakEnglish();
    void speakJapanese();
}

abstract class Tom implements Job{
    public void speakChinese(){};
    public void speakEnglish(){};
    public void speakJapanese(){};
}

//只想实现接口内的其中一个方法,需要用抽象类空实现接口的抽象方法
class Jack extends Tom{
    public void speakChinese(){
        System.out.println("只想说汉语");
    }
}
原文地址:https://www.cnblogs.com/frankruby/p/12869509.html