Java中的接口

定义

接口就是给出一些没有实现的方法, 封装到一起, 在某个类要使用的时候, 根据具体情况将这些方法实现出来

interface 接口名 {
  //属性
  //方法
}
class 类名 implements 接口 {
  自己的属性;
  自己的方法;
  必须实现的接口的抽象方法
}

在Jdk7之前, 接口内的方法都是抽象方法, Jdk8之后, 接口可以有方法的具体实现, 但是需要使用default 修饰, 或者是static 方法

相关细节

  1. 接口不能被实例化
  2. 接口中所有的方法都是public 方法, 且其抽象方法可以省略abstract关键字
  3. 一个普通类实现接口必须要将其所有抽象方法都实现, 抽象类实现接口可以不用实现接口的方法
  4. 一个类可以实现多个接口
interface IA {
    void hi();
}

interface IB {
    void say();
}

class P implements IA, IB {

    @Override
    public void hi() {

    }
    @Override
    public void say() {
        
    }
}
  1. 接口中的属性只能是final, 而且是public static final 修饰符, 所以可以使用IA.n1 来访问属性
interface IA {
    int n1 = 10; // 相当于public static final int n1 = 10;
    void hi();
}
  1. 接口不能继承其他的类, 但是可以继承其他多个接口

  2. 接口的修饰符只能是public 或者 默认

接口和继承的比较

interface SwimAble {
    void swimming();
}

interface FlyAble {
    void flying();
}

class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    void say() {
        System.out.println("人类说话");
    }
}

class Student extends Person implements FlyAble, SwimAble {
    public Student(String name) {
        super(name);
    }
    @Override
    public void swimming() {
        System.out.println("通过学习, 学会游泳");
    }
    @Override
    public void flying() {
        System.out.println("通过学习, 学会飞翔");
    }
}

通过例子可以看出, 当子类继承了父类, 就自动拥有了父类的功能, 但是如果子类需要扩展功能,
就可以通过实现接口的方式扩展
所以, 实现接口是对java单继承机制的一种补充和完善

接口比继承更加灵活, 在一定程度上实现了代码解耦

接口的多态

  1. 接口引用可以指向实现了接口的类的对象
interface A {}

class B implements A {}
class C implements A {}
public static void main(String[] args) {
    A a = new B();
    a = new C();
}
  1. 和继承一样, 可以使用instanceof 来判断运行类型, 然后使用向下转型

  2. 多态转递

interface A {}
interface B extends A {}
class C implements B {}
public static void main(String[] args) {
    A a = new C();
    B b = new C();
}

也就是接口之间继承, 和类与接口之间的实现, 这两者之间存在传递关系

posted @   Xingon2356  阅读(5)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示