首页 > 编程语言 >java学习-接口

java学习-接口

时间:2024-04-28 22:33:06浏览次数:27  
标签:Coach java defend void 接口 学习 抽象类 public

01、定义接口

接口用interface关键字去表示,不可以带私有化修饰符,比如protected、final等。接口就是用来被继承implements实现的,如果不允许访问,那就没意义了。接口同样不允许new实例化。

02.接口的作用

第一,使某些实现类具有我们想要的功能,比如说,实现了 Cloneable 接口的类具有拷贝的功能,实现了 Comparable 或者 Comparator 的类具有比较功能。

第二,Java 原则上只支持单一继承,但通过接口可以实现多重继承的目的。(php:俺也一样!)。

第三,实现多态。多态可以通过继承(extends)的关系实现,也可以通过接口的形式实现。

说一下多态存在的 3 个前提:
1、要有继承关系,比如说 Circle 和 Square 都实现了 Shape 接口。
2、子类要重写父类的方法,Circle 和 Square 都重写了 name() 方法。
3、父类引用指向子类对象,circleShape 和 squareShape 的类型都为 Shape,但前者指向的是 Circle 对象,后者指向的是 Square 对象。

03.接口的三种模式

策略模式、适配器模式和工厂模式。

1)策略模式

策略模式的思想是,针对一组算法,将每一种算法封装到具有共同接口的实现类中,接口的设计者可以在不影响调用者的情况下对算法做出改变。示例如下:

// 接口:教练
interface Coach {
    // 方法:防守
    void defend();
}

// 何塞·穆里尼奥
class Hesai implements Coach {

    @Override
    public void defend() {
        System.out.println("防守赢得冠军");
    }
}

// 德普·瓜迪奥拉
class Guatu implements Coach {

    @Override
    public void defend() {
        System.out.println("进攻就是最好的防守");
    }
}

public class Demo {
    // 参数为接口
    public static void defend(Coach coach) {
        coach.defend();
    }
    public static void main(String[] args) {
        // 为同一个方法传递不同的对象
        defend(new Hesai());
        defend(new Guatu());
    }
}

2)适配器模式

interface Coach {
    void defend();
    void attack();
}

// 抽象类实现接口,并置空方法
abstract class AdapterCoach implements Coach {
    public void defend() {};
    public void attack() {};
}

// 新类继承适配器
class Hesai extends AdapterCoach {
    public void defend() {
        System.out.println("防守赢得冠军");
    }
}

public class Demo {
    public static void main(String[] args) {
        Coach coach = new Hesai();
        coach.defend();
    }
}

Coach 接口中定义了两个方法(defend() 和 attack()),如果类直接实现该接口的话,就需要对两个方法进行实现。

如果我们只需要对其中一个方法进行实现的话,就可以使用一个抽象类作为中间件,即适配器(AdapterCoach),用这个抽象类实现接口,并对抽象类中的方法置空(方法体只有一对花括号),这时候,新类就可以绕过接口,继承抽象类,我们就可以只对需要的方法进行覆盖,而不是接口中的所有方法。

3)工厂模式

// 教练
interface Coach {
    void command();
}

// 教练学院
interface CoachFactory {
    Coach createCoach();
}

// A级教练
class ACoach implements Coach {

    @Override
    public void command() {
        System.out.println("我是A级证书教练");
    }
    
}

// A级教练学院
class ACoachFactory implements CoachFactory {

    @Override
    public Coach createCoach() {
        return new ACoach();
    }
    
}

// C级教练
class CCoach implements Coach {

    @Override
    public void command() {
        System.out.println("我是C级证书教练");
    }
    
}

// C级教练学院
class CCoachFactory implements CoachFactory {

    @Override
    public Coach createCoach() {
        return new CCoach();
    }
    
}

public class Demo {
    public static void create(CoachFactory factory) {
        factory.createCoach().command();
    }
    
    public static void main(String[] args) {
        // 对于一支球队来说,需要什么样的教练就去找什么样的学院
        // 学院会介绍球队对应水平的教练。
        create(new ACoachFactory());
        create(new CCoachFactory());
    }
}

04、抽象类和接口的区别

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

举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类 Airplane,将鸟设计为一个类 Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。

此时可以将 飞行 设计为一个接口 Fly,包含方法 fly(),然后 Airplane 和 Bird 分别根据自己的需要实现 Fly 这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承 Airplane 即可,对于鸟也是类似的,不同种类的鸟直接继承 Bird 类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

接口是对类的某种行为的一种抽象,接口和类之间并没有很强的关联关系,举个例子来说,所有的类都可以实现 Serializable 接口,从而具有序列化的功能,但不能说所有的类和 Serializable 之间是 is-a 的关系。

抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过 ppt 里面的模板,如果用模板 A 设计了 ppt B 和 ppt C,ppt B 和 ppt C 公共的部分就是模板 A 了,如果它们的公共部分需要改动,则只需要改动模板 A 就可以了,不需要重新对 ppt B 和 ppt C 进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

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

标签:Coach,java,defend,void,接口,学习,抽象类,public
From: https://www.cnblogs.com/itbaby/p/18164653

相关文章

  • 机器学习100道经典题库
    机器学习100道经典题库  目录练习一练习二练习三练习四​​​​​​​练习一1监督学习是根据已有的数据集中(输入特征)和输出标签(Label)之间的关系2分类问题的目标是预测(类别标签)3回归问题的目标是预测(一组连续值)4不收敛一般出现在(基于梯度下降)算法的模型......
  • java学习-抽象类
    01.定义抽象类定义抽象类的时候需要用到关键字abstract,放在class关键字前,就像下面这样。abstractclassAbstractPlayer{}02.抽象类的特征抽象类是不能实例化的,尝试通过new关键字实例化的话,编译器会报错,提示“类是抽象的,不能实例化”。但是,子类可以通过extends关键......
  • 机器学习理论问答题刷题宝典2023
    机器学习理论问答题刷题宝典机器学习理论问答题刷题宝典20231.请简要介绍下SVM。SVM,全称是supportvectormachine,中文名叫支持向量机。SVM是一个面向数据的分类算法,它的目标是为确定一个分类超平面,从而将不同的数据分隔开。扩展:支持向量机学习方法包括构建由简至繁的模......
  • 接口测试学习111
    1、同步接口:2、异步接口:不需要等接口的调用结果也可以继续执行。轮询方式。3、回调接口:一、代理类型1、协议:http、https。代理fiddler2、协议:TCP协议簇,代理:socks43、协议:TCP、UDP协议簇,代理:socks5二、接口测试范围/类型1、接口功能测2、接口性能和安全测试3、接口兼容性......
  • 短信验证码登录接口,如何防止恶意攻击
    本文相关词汇:OTP-One-TimePassword一次性动态密码,这种验证码具有时效性,通常有效期在1~2分钟内。手机短信验证码就是一种OTP。MFA-多重因子认证。先说单因子认证,我们的系统登录通常是账密登录,这种就是单因子认证方式的登录。现在为了安全,许多网站开始使用双因子认证登录......
  • Java流程控制
    输入流ScannerScannerscanner=newScanner(System.in);通常会用hasNext()或者hasNextLine()来判断还有没有输入字符,用next(),nextLine()来接收用户的输入next():一定要读取到有效字符后才能结束输入;对有效字符钱的空白会自动去掉,有效字符后的空白作为分隔符或者结束符,不能......
  • 接口规范
    需要注意兼容php、java等多语言,即弱类型+强类型如返回user_name字符串类型,就不能查询失败返回null 返回json格式codeint格式msgstring格式data根据接口不同返回不同格式一般是对象或者数组,如果不需要使用data,可以返回null(默认null) php创建对象$obj=newstdClas......
  • 8086 汇编学习 Part 4
    寻址方式形式名称特点意义示例[idata]直接寻址用一个常量/立即数来表示地址用于直接定位一个内存单元MOVAX,[200][BX]寄存器间接寻址用一个变量来表示内存地址用于间接定位一个内存单元MOVAX,[BX][BX+idata]寄存器相对寻址用一个变量和常量......
  • httprunner 4.x学习 - 12 测试用例引用另一个测试用例
    前言把登录用例变 export导出变量,变成全局变量,这样其它用例可以引用登录用例config:name:登录variables:username:"admin1"password:"123456"teststeps:-name:postrequest:method:POSTurl:${ENV(base_url)}/loginjson:......
  • Java的基础知识
    一.Java入门Java的特性和优势:简单性,面向对象,可移植性,高性能,分布式,动态性,多线程,安全性,健壮性;Java三大版本:JavaSE:标准版(桌面程序,控制台开发)JavaME:嵌入式开发(手机,小家电)JavaEE:企业级开发(web端,服务器开发)JDK,JRE,JVM三者之间的关系:JDK(JavaDevelopmentKit):Java开发......