面向对象(下)-接口的理解

面向对象(下)-接口的理解

6.6 接口(interface)

概述:

  • 一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方法,但是,Jvava不支持多重继承。有了几口,就可以通过多重实现得到多重继承的效果。

  • 另一方面,有时必须 从几个类中抽取出一些共同的行为特征,而他们之间又没有is-a的关系,仅仅是具有相同的行为特征而已。例如:鼠标、键盘、打印机灯都支持USB连接。

  • 接口就是规范,定义的是一组规则,体现了现实世界中"如果你是/要...则必须能..."的思想。继承是一个"是不是"的关系,而接口实现则是"能不能"的关系. 如:黄种人是人类,黄种人能吃饭、睡觉,狗也能吃饭睡觉,那么黄种人可以继承人类,实现吃饭、睡觉等接口。

  • 接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都要遵守。如:打印机能使用USB,则打印机必须遵守USB的规范,使用统一的USB端口和协议。

  • 接口和类是并列的关系。

面向对象(下)接口的定义与使用

接口的使用

  • a、接口使用interface定义

  • b、java中,接口和类是并列的两个结构

  • c、如何定义接口:定义接口中的成员

    • JDK7及以前:in定义全局常量和抽象方法
  • -(全局常量:public static final,书写时可以省略)

  • -(抽象方法:public abstract,书写时可以省略)

    • JDK8及以后:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
  • d、接口中不能定义构造器!意味着接口不可以实例化

  • e、java开发中,接口通过让类实现(implements)方式来使用

    • 如果实现类覆盖了接口的所有抽象方法,则此实现类可以实例化。
    • 如果实现类未覆盖接口的所有抽象方法,则此实现类为抽象类。
  • f、java类可以实现多个接口 (弥补了java单继承的局限性)

    • 格式:class AA extends BB implements CC, DD, EE
  • g、接口与接口之间可以继承,而且可以多继承

    • 格式:Interface AA extends BB, CC {}
  • h、接口的具体使用,体现了多态性

  • i、接口,实际上可以看做是一种规范

  • j、接口的主要用途就是被实现类实现。(面向接口编程)

java 复制代码
public class InterfaceTest {
    public static void main(String[] args) {
        Plan plan = new Plan();
        plan.fly();    // 以7900速度起飞!
        plan.stop();   // 以1速度减速停止!

        Fly fly = new Plan();  // 展示接口的多态;
        fly.fly();    // 以7900速度起飞!
        fly.stop();   // 以1速度减速停止!
    }
}
// 某某能飞
interface Fly {
    public static final int MAX_SPEED = 7900; // 最快速度
    int MIN_SPEED = 1;  // 省略public static final  最慢速度
    public abstract  void fly();  // 开始飞
    void stop();  // 省略public abstract  停下来
}
// 飞机能飞
class Plan implements Fly, AA{  // 类可以继承或多继承接口
    @Override
    public void fly() {
        System.out.println("以" + Fly.MAX_SPEED + "速度起飞!");
    }
    @Override
    public void stop() {
        System.out.println("以" + Fly.MIN_SPEED + "速度减速停止!");
    }
}
interface AA{}
interface BB{}
interface CC extends AA, BB{}  // 接口可以继承或多继承接口

面向对象(下)创建接口匿名实现类的对象

对标匿名类的对象。

java 复制代码
    public static void main(String[] args) {
        // 接口的非匿名实现类对象
        Plan plan = new Plan();
        plan.fly();    // 以7900速度起飞!
        plan.stop();   // 以1速度减速停止!

        // 接口的非匿名实现类对象
        Fly fly = new Plan();  // 展示接口的多态;
        fly.fly();    // 以7900速度起飞!
        fly.stop();   // 以1速度减速停止!

        // 接口的非匿名实现类的匿名对象:Plan类实现了接口Fly,且这个对象没有名字。
        new Plan().fly();

        // 接口的匿名实现类的非匿名对象:接口的实现类没名字,但是对象有名字。
        Fly fly1 = new Fly() {
            @Override
            public void fly() {}
            @Override
            public void stop() {
            }
        };

        // 接口的匿名实现类的匿名对象:接口没有实现类,对象也没名字。
        new Fly() {
            @Override
            public void fly() {}

            @Override
            public void stop() {}
        }.fly();
    }
相关推荐
程序员游老板2 小时前
基于SpringBoot3+vue3的爱心陪诊平台
java·spring boot·毕业设计·软件工程·课程设计·信息与通信
期待のcode2 小时前
Springboot核心构建插件
java·spring boot·后端
遥不可及~~斌2 小时前
Java 面试题集 -- 001
java·开发语言
2501_921649492 小时前
如何获取美股实时行情:Python 量化交易指南
开发语言·后端·python·websocket·金融
C182981825752 小时前
HttpURLConnection 与其他客户端关系
java
集智飞行2 小时前
c++函数传参的几种推荐方式
开发语言·c++
通往曙光的路上3 小时前
发邮件1、创建邮箱
java
鼾声鼾语3 小时前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
麦麦鸡腿堡3 小时前
Java_类的加载
java·开发语言