首页 > 其他分享 >接口

接口

时间:2024-07-13 23:29:33浏览次数:15  
标签:CSPlayer void 接口 static 抽象类 public

接口

定义接口

public interface Electronic {
    // 常量
    String LED = "LED";

    // 抽象方法
    int getElectricityUse();

    // 静态方法
    static boolean isEnergyEfficient(String electtronicType) {
        return electtronicType.equals(LED);
    }

    // 默认方法
    default void printDescription() {
        System.out.println("电子");
    }
}

反编译后的字节码:

public interface Electronic
{

    public abstract int getElectricityUse();

    public static boolean isEnergyEfficient(String electtronicType)
    {
        return electtronicType.equals("LED");
    }

    public void printDescription()
    {
        System.out.println("\u7535\u5B50");
    }

    public static final String LED = "LED";
}

  • 接口中定义的变量会在编译的时候自动加上 public static final 修饰符

  • 没有使用 privatedefault 或者 static 关键字修饰的方法是隐式抽象的,在编译的时候会自动加上 public abstract 修饰符。

  • 接口不允许直接实例化

  • 接口可以是空的,既可以不定义变量,也可以不定义方法。

  • 不要在定义接口的时候使用final关键字,否则会报编译错误,因为接口就是为了让子类实现的,而final阻止了这种行为。

  • 接口的抽象方法不能是private、protected或者final否则编译器都会报错。

  • 接口的变量是隐式 public static final(常量),所以其值无法改变。

接口作用

  1. 使某些实现类具有我们想要的功能
  2. Java 原则上只支持单一继承,但通过接口可以实现多重继承的目的。
    • 菱形问题:ClassA和ClassB继承同一个父类,ClassC同时继承了ClassA和ClassB,ClassC的对象在调用ClassA和ClassB中重写的方法时,就不知道该调用ClassA的方法,还是ClassB的方法。
  3. 实现多态
    • 多态是指同一个事件发生在不同的对象上会产生不同的结果
    • 多态可以通过继承(extends)的关系实现,也可以通过接口的形式实现。

接口的三种设计模式

策略模式

  • 针对一组算法,将每一种算法封装到具有共同接口的实现类中,接口的设计者可以在不影响调用者的情况下对算法做出改变。
package test.Interface;

// CS玩家
interface CSPlayer {
    // 游戏策略
    void strategy();
}

class Cadian implements CSPlayer {

    @Override
    public void strategy() {
        System.out.println("ECO局变形金刚");
    }
}

class Jame implements CSPlayer {

    @Override
    public void strategy() {
        System.out.println("保狙,save,save");
    }
}

public class Test {
    // 参数作为接口
    public static void strategy(CSPlayer csPlayer) {
        csPlayer.strategy();
    }

    public static void main(String[] args) {
        // 为同一个方法传递不同的对象
        strategy(new Cadian());
        strategy(new Jame());
    }
}

适配器模式

  • 针对调用者的需求对原有的接口进行转接。
// CS玩家
interface CSPlayer {
    // 指挥
    void conduct();
    // 突破
    void breakthrough();
}
// 抽象类实现接口,并置空方法
abstract class AbstractCSPlayer implements CSPlayer {
    public void conduct() {}
    public void breakthrough() {}
}
// 新类继承适配器
class Cadian extends AbstractCSPlayer {
    @Override
    public void conduct() {
        System.out.println("指挥队友");
    }
}
class Niko extends AbstractCSPlayer {
    @Override
    public void breakthrough() {
        System.out.println("AK突破手");
    }
}
  • 接口中定义了两个方法,如果类直接实现该接口,需要对两个方法都进行实现。
  • 如果只需对其中一个方法进行实现,可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,并对抽象类中的方法置空。此时新类就可以绕过接口去继承抽象类,就可以只对需要的方法进行覆盖。

工厂模式

  • 需要啥就用对应的工厂生产
// CS玩家
interface CSPlayer {
    void duty();
}

// CSer学院
interface CSerFactory {
    CSPlayer createCSer();
}

class Sniper implements CSPlayer {
    @Override
    public void duty() {
        System.out.println("狙击手");
    }
}

class Breaker implements CSPlayer {
    @Override
    public void duty() {
        System.out.println("突破手");
    }
}

// 狙击手学院
class SniperFactory implements CSerFactory {
    @Override
    public CSPlayer createCSer() {
        return new Sniper();
    }
}

// 突破手学院
class BreakerFactory implements CSerFactory {
    @Override
    public CSPlayer createCSer() {
        return new Breaker();
    }
}

public class Test {
    public static void createCSer(CSerFactory factory){
        factory.createCSer().duty();
    }

    public static void main(String[] args) {
        createCSer(new SniperFactory());
        createCSer(new BreakerFactory());
    }
}

接口和抽象类的区别

  • 1、抽象类可以有方法体的方法,但接口没有(Java 8 以前)。
  • 2、接口中的成员变量隐式为 static final,但抽象类不是的。
  • 3、一个类可以实现多个接口,但只能继承一个抽象类。

语法层面

  • 抽象类可以提供成员方法的实现细节,而接口中只能存在 public abstract 方法;
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的;
  • 接口中不能含有静态代码块,而抽象类可以有静态代码块;
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

设计层面

  • 抽象类是对一种事物的抽象,即对类抽象,继承抽象类的子类和抽象类本身是一种 is-a 的关系。而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

  • 抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

标签:CSPlayer,void,接口,static,抽象类,public
From: https://www.cnblogs.com/sprinining/p/18300989

相关文章

  • Java基础,final关键字,权限修饰符,内部类,抽象类和接口作为方法的参数和返回值,System类,Obj
    一.final关键字1.final:不可以改变,可以用来修饰类,方法和变量类:被修饰的类,不能被继承方法:被修饰的方法,不能被重写变量:被修饰的变量,不能被重新赋值2.格式:    修饰类:finalclass类名{}    修饰方法:publicfinal返回值类型方法名(){}    修饰变量:fin......
  • 六爻排盘 api数据接口
    六爻排盘是一种古老的易学命理系统,‌起源于易经,‌是中国古代命理学的重要组成部分。‌它通过将六个爻位按照顺序排列,‌形成六爻,‌每个爻有阳爻和阴爻两种状态,‌共有64种不同的排列组合,‌每一种排列组合都称为一卦。‌接口名称:流盘-六爻排盘接口平台:缘份居国学研究(缘份居国学研......
  • Smart-doc:零注解侵入的API接口文档生成插件
    零注解侵入的API接口文档生成插件——Smart-docsmart-doc是一款同时支持JAVARESTAPI和ApacheDubboRPC接口文档生成的工具,在业内率先提出基于JAVA泛型定义推导的理念,完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中。你只需要按照java-doc标准编写......
  • 浅谈接口自动化测试
    接口测试大家一定不陌生了,对QA来说也是一项比较基础的技能,并且在现代软件开发中,持续集成已经成为一种不可或缺的实践,所以很多项目中都会做UI自动化、接口自动化的持续集成。在实际工作中,个人感觉接口自动化测试比UI自动化测试性价比要高得多的多,首先接口测试在整个流程......
  • 面向对象-接口和多态
     1.接口的特性:接口里的数据成员必须初始化,且数据成员均为常量;接口里的方法必须全部声明为abstract,也就是说,接口不能像抽象类一样保有一般的方法,而必须全部是“抽象方法”。2.接口定义的语法:interface接口名称//定义抽象类{final数据类型成员名称=常量;/......
  • Java中的接口多继承详解
    Java中的接口多继承详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java中,类的多继承是不被允许的,但是接口的多继承却是被允许的。接口多继承可以使得类具备多种行为,并且解耦合代码,有助于提升代码的可维护性和可扩展性。本文将详细介绍Java中接口多......
  • 8-Map接口和常用方法
    8-Map接口和常用方法Map与Collection并列存在。用于保存具有映射关系的数据:Key-ValueMap中的key和value可以是任何引用数据类型,会封装到HashMap$Node对象中Map中的key不允许重复Map中的value可以重复Map的key可以为null,value也可以为null,注意key......
  • Avalon MM 接口的PIO的bidir和inout的区别
     当我们设置PIO这个IP的方向的时候,可以看到: Input和Output一个是输入,一个是输出,那么Bidir和InOut有什么区别呢? bidir,指n位宽的信号中的每1bit,可以单独分别设置为读还是写。inout,指将n位宽的信号,全设置为读或写。只有设置为bir模式的时候,才存在direction寄存器,用于控制......
  • WSDL接口调用
    1.使用ApacheCXF工具调用1.1.MAVEN引用<!--cxf--><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.1.10</version></dependency><depen......
  • 推荐几个免费的http mock接口
    在前后端分离开发架构下,经常遇到调用后端数据API接口进行测试、集成、联调等需求,比如:(1)前端开发人员很快开发完成了UI界面,但后端开发人员的API接口还没有完成,不能进行前后端数据接口对接和联调,很容易影响开发进度。前端开发人员用的比较多的开源组件有mock.js,但该组件缺乏界面管理......