Java接口:用于实现各种动态功能

  • 👑专栏内容:Java
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录


1、接口概念

在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。电脑的USB口上,可以插:U盘、鼠标、键盘等所有符合USB协议的设备。接口其实就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

接口,也可以进一步看成是抽象类的进一步抽象。接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。

java 复制代码
//
interface IShape{
    public abstract void draw();

    public static void draw3() {
        System.out.println("1234");
    }
}
//
class Cycle implements IShape{
    @Override
    public void draw() {
        System.out.println("⭕");
    }
}
public class Test {
    public static void drawMap(IShape iShape){
        iShape.draw();
    }
    public static void main(String[] args) {
        Cycle cycle = new Cycle();
        drawMap(new Cycle());
    }
}

提示:

  1. 创建接口时, 接口的命名一般以大写字母 I 开头
  2. 接口的命名一般使用 "形容词" 词性的单词
  3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性

接口中,不能有实现的方法,但是有2种类型的方法需要注意:

  1. 静态方法可以有具体的实现
  2. 这个方法被default关键字修饰,也是可以的。

注意事项:

  1. 接口是使用interface来定义的
  2. 接口当中的方法默认是public abstract修饰的
  3. 接口中的成员变量默认是public static final修饰的
  4. 接口也不能通过关键字new来进行实例化
  5. 类和接口之间,我们使用关键字implements来进行关联
  6. 当一个类实现一个接口后,这个类必须重写这个接口种的抽象方法
  7. 当接口当中存在default方法,可以选择重写,也可以选择不重写
  8. 一个类不想实现接口中的方法,这个类可以被定义为抽象类

2、实现一个接口

定义一个接口 Flying,里面包含一个飞行的方法。

java 复制代码
public interface Flying {
    // 接口中的方法 fly
    void fly();
}

实现接口的一个类 Bird

java 复制代码
public class Bird implements Flying {
    // 实现接口方法 'fly'
    @Override
    public void fly() {
        System.out.println("The bird is flying");
    }
}

3、实现多个接口

在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。一个类实现多个接口,可以解决多继承的问题。

下面通过类来表示一组动物。

java 复制代码
class Animal {
    protected String name;
    public Animal(String name) {
    	this.name = name;
    }
}

另外我们再提供一组接口, 分别表示 "会飞的", "会跑的", "会游泳的"。这三个接口,每个接口代表的功能是不一样的。

java 复制代码
interface IFlying {
	void fly();
}
interface IRunning {
	void run();
}
interface ISwimming {
	void swim();
}

接下来我们创建几个具体的动物,注意要先继承类再实现接口。

猫,是会跑的

java 复制代码
class Cat extends Animal implements IRunning {
    public Cat(String name) {
    super(name);
}
    @Override
    public void run() {
    System.out.println(this.name + "正在用四条腿跑");
	}
}

鱼,是会游泳的

java 复制代码
class Fish extends Animal implements ISwimming {
    public Fish(String name) {
    	super(name);
}
    @Override
    public void swim() {
    System.out.println(this.name + "正在用尾巴游泳");
    }
}

青蛙, 是既能跑, 又能游的

java 复制代码
class Frog extends Animal implements IRunning, ISwimming {
    public Frog(String name) {
    	super(name);
}
    @Override
    public void run() {
    	System.out.println(this.name + "正在往前跳");
    }
    @Override
    public void swim() {
    	System.out.println(this.name + "正在蹬腿游泳");
    }
}

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类

上面的代码展示了 Java 面向对象编程中最常见的用法:一个类继承一个父类, 同时实现多种接口。继承表达的含义是 is-a语义, 而接口表达的含义是 具有 xxx特性

猫是一种动物, 具有会跑的特性.
青蛙也是一种动物, 既能跑, 也能游泳
鸭子也是一种动物, 既能跑, 也能游, 还能飞

这样设计有什么好处呢? 时刻牢记多态的好处, 让程序猿忘记类型。有了接口之后, 类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力。
例如, 现在实现一个方法, 叫 "散步"

java 复制代码
public static void walk(IRunning running) {
    System.out.println("我带着伙伴去散步");
    running.run();
}

在这个 walk 方法内部, 我们并不关注到底是哪种动物, 只要参数是会跑的, 就行

java 复制代码
Cat cat = new Cat("小猫");
walk(cat);
Frog frog = new Frog("小青蛙");
walk(frog);

4、接口间的继承

在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。接口可以继承一个接口,使用 extends 关键字,达到复用的效果。

java 复制代码
interface IRunning {
    void run();
    }
interface ISwimming {
    void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
    
}

通过接口继承创建一个新的接口 IAmphibious 表示 "两栖的"。此时实现接口就继续要实现 run 方法, 也需要实现 swim 方法。

接口间的继承相当于把多个接口合并在一起

相关推荐
堕落年代3 分钟前
Ollama CPU 推理大提示词优化实测报告(细致化数据版)
java·后端·spring
KobeSacre28 分钟前
ForkJoinPool 源码
java
wear工程师1 小时前
Kafka 消费者心跳正常,为什么还会被踢出组?拆清 max.poll.interval.ms
java·kafka
SemiTris1 小时前
为什么 C/C++ 不走 Java 式的虚拟机跨平台路线?
java·程序员
weixin_440784111 小时前
【IntentSeivice实现原理】
android·java·开发语言·intentservice
IanSkunk1 小时前
企业AI Agent生产化落地:从技术架构到实施服务的全链路分析
java·人工智能·架构
岁岁养乐多2 小时前
Java 序列化相关问题
java·开发语言
叶总没有会2 小时前
5.1知识库概念进阶
java·人工智能·spring·阿里云·ai·原型模式
小短腿乄2 小时前
java实现pdf加水印+签名
java·开发语言·pdf
云烟成雨TD3 小时前
Micrometer 系列【29】源码分析:MeterRegistry 实例化流程
java·云原生·micrometer